本文依据官网教程批改而来。

一、筹备

要遵循本指南,你须要:

  • 一个或多个 Debian 9 / Ubuntu 18.04 虚拟机,物理机当然更好
  • 每台机器 2GB 以上的内存
  • 用作管制平台节点的虚拟机至多有 2 个CPU
  • 集群中所有计算机之间具备齐全的网络连接

更改主节点 hostname 为 k8s-master,子节点依据数量批改 hostname 为 k8s-node-n,每个节点都要批改 hosts文件,增加所有节点的 ip 和 hostname 的映射关系,如:

# k8s cluster nodes start192.168.31.221 k8s-master192.168.31.222 k8s-node-1192.168.31.231 k8s-node-2# k8s cluster nodes end

二、教程开始

1 装置 kubeadm

1.1 容许 iptables 查看桥接流量

确保 br_netfilter 模块被加载。这一操作能够通过运行 lsmod | grep br_netfilter 来实现。若要显式加载该模块,可执行 sudo modprobe br_netfilter

为了让你的 Linux 节点上的 iptables 可能正确地查看桥接流量,你须要确保在你的 sysctl 配置中将 net.bridge.bridge-nf-call-iptables 设置为 1。例如:

cat <<EOF | sudo tee /etc/modules-load.d/k8s.confbr_netfilterEOFcat <<EOF | sudo tee /etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1EOFsudo sysctl --system

1.2 装置 Docker

参考 docker-ce | 镜像站应用帮忙 | 北京外国语大学开源软件镜像站 | BFSU Open Source Mirror。

不再细述。

1.3 装置 kubeadm、kubelet 和 kubectl

你须要在每台机器上装置上面的软件包:

  • kubeadm:用来初始化集群的指令。
  • kubelet:在集群中的每个节点上用来启动 Pod 和容器等。
  • kubectl:用来与集群通信的命令行工具。

kubeadm 不能 帮你装置或者治理 kubeletkubectl,所以你须要 确保它们与通过 kubeadm 装置的管制立体的版本相匹配。 如果不这样做,则存在产生版本偏差的危险,可能会导致一些意料之外的谬误和问题。 然而,管制立体与 kubelet 间的相差一个主要版本不统一是反对的,但 kubelet 的版本不能够超过 API 服务器的版本。 例如,1.7.0 版本的 kubelet 能够齐全兼容 1.8.0 版本的 API 服务器,反之则不能够。

装置过程

  1. 更新 apt 包索引并装置应用 Kubernetes apt 仓库所须要的包:

    sudo apt-get updatesudo apt-get install -y apt-transport-https ca-certificates curl
  2. 下载并增加签名密钥,用华为镜像操作

    curl -s https://repo.huaweicloud.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
  3. 增加 Kubernetes apt 仓库,华为镜像:

    cat <<EOF > /etc/apt/sources.list.d/kubernetes.list deb https://repo.huaweicloud.com/kubernetes/apt/ kubernetes-xenial mainEOF
这里须要留神,kubernetes-xenial不扭转,版本代码一扭转,将无奈在 apt 仓库中找到 kubeadm 和kubelet。而 apt 仓库中保留的是通用 DEB 包, Debian 和 Ubuntu 不辨别版本都能够用,所以不要改变此处。我用的是 Debian 9,将其改为kubernetes-stretch后就遇到了此问题,改为kubernetes-xenial才顺利装置。
  1. 更新 apt 包索引,装置 kubelet、kubeadm 和 kubectl,并锁定其版本:

    sudo apt-get updatesudo apt-get install -y kubelet kubeadm kubectlsudo apt-mark hold kubelet kubeadm kubectl

第一大节内容所有虚拟机上都要操作一次。

2 创立集群

2.1 查看 kubeadm 初始化所需镜像

kubeadm 初始化时会拉取一些 docker 镜像,查看fmd要的镜像列表:

➜  ~ kubeadm config images listk8s.gcr.io/kube-apiserver:v1.21.1k8s.gcr.io/kube-controller-manager:v1.21.1k8s.gcr.io/kube-scheduler:v1.21.1k8s.gcr.io/kube-proxy:v1.21.1k8s.gcr.io/pause:3.4.1k8s.gcr.io/etcd:3.4.13-0k8s.gcr.io/coredns/coredns:v1.8.0

能够看到,应用的镜像仓库是国内无奈失常拜访的k8s.gcr.io,所以须要另想办法实现镜像拉取。

2.2 拉取镜像

配置好 docker 镜像仓库,通常都应用阿里云减速。

在 docker hub 中逐个搜寻对应的镜像,并将所需标签的镜像 pull 到本地。

kube-apiserver为例,pull 到本地后,批改其本地标签:

docker tag 8522d622299c k8s.gcr.io/kube-apiserver:v1.21.1

2.3 kubeadm 初始化

kubeadm须要应用 root 账户或 root 权限运行。

kubeadm 须要应用 systemd 来治理容器的 cgroup。

初始化前批改 docker 的 daemon.json,增加一行"exec-opts": ["native.cgroupdriver=systemd"],最终相似于:

{    "exec-opts": ["native.cgroupdriver=systemd"],    "registry-mirrors": [              "xxxxx.mirror.aliyuncs.com"  // 这里的镜像仓库须要改成本人的    ]}
sudo systemctl daemon-reloadsudo systemctl restart docker

初始化命令:

sudo kubeadm init \  --apiserver-advertise-address=192.168.31.221 \  --service-cidr=10.96.0.0/12 \  --pod-network-cidr=10.244.0.0/16
  • 第一个参数是主节点的 ip 地址
  • 第二个参数是为 service 另指定一个 ip 地址段
  • 第三个参数是为 pod 网络指定的 ip 地址段

初始化胜利后,最初会输入相似上面的后果:

Your Kubernetes control-plane has initialized successfully!To start using your cluster, you need to run the following as a regular user:  mkdir -p $HOME/.kube  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config  sudo chown $(id -u):$(id -g) $HOME/.kube/configAlternatively, if you are the root user, you can run:  export KUBECONFIG=/etc/kubernetes/admin.confYou should now deploy a pod network to the cluster.Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:  https://kubernetes.io/docs/concepts/cluster-administration/addons/Then you can join any number of worker nodes by running the following on each as root:kubeadm join 192.168.31.221:6443 --token jc2ohi.sot5cfuqtvyx4bsk \    --discovery-token-ca-cert-hash sha256:584a842a831fe3226341ce0f5812a94eb6042188e070e4946af7127c689cb13b

最初的命令就是子节点退出集群的命令,在子节点中以 root 权限运行即可。

而后在主节点中用普通用户运行上面的命令:

mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config

最初在主节点中查看全副节点:

➜  ~ kubectl get nodesNAME         STATUS   ROLES                  AGE     VERSIONk8s-master   Ready    control-plane,master   10m     v1.21.1k8s-node-1   Ready    <none>                 9m26s   v1.21.1k8s-node-2   Ready    <none>                 9m2s    v1.21.1

集群中所有节点都已筹备好了。

3 装置 Pod 网络附加组件

你必须部署一个基于 Pod 网络插件的 容器网络接口 (CNI),以便你的 Pod 能够互相通信。 在装置网络之前,集群 DNS (CoreDNS) 将不会启动。

可用的第三方 CNI 列表见 CNI | Kubernetes。

本文应用Flannel

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

装置过程很快,实现后即可查看 coredns 状态:

kubectl get pods -n kube-system

后果:

NAME                                 READY   STATUS    RESTARTS   AGEcoredns-54695bfdf-24whr              1/1     Running   0          29mcoredns-54695bfdf-p8knz              1/1     Running   0          29metcd-k8s-master                      1/1     Running   0          29mkube-apiserver-k8s-master            1/1     Running   0          29mkube-controller-manager-k8s-master   1/1     Running   0          29mkube-flannel-ds-4w2lt                1/1     Running   0          16skube-flannel-ds-7x9w7                1/1     Running   0          16skube-flannel-ds-rgcxl                1/1     Running   0          16skube-proxy-gtf4d                     1/1     Running   0          29mkube-proxy-pvhbp                     1/1     Running   0          28mkube-proxy-s6xj9                     1/1     Running   0          28mkube-scheduler-k8s-master            1/1     Running   0          29m

应用 API 查看集群衰弱状态:

curl -k https://localhost:6443/livez\?verbosecurl -k https://localhost:6443/readyz\?verbose
[+]ping ok[+]log ok[+]etcd ok[+]poststarthook/start-kube-apiserver-admission-initializer ok[+]poststarthook/generic-apiserver-start-informers ok[+]poststarthook/priority-and-fairness-config-consumer ok[+]poststarthook/priority-and-fairness-filter ok[+]poststarthook/start-apiextensions-informers ok[+]poststarthook/start-apiextensions-controllers ok[+]poststarthook/crd-informer-synced ok[+]poststarthook/bootstrap-controller ok[+]poststarthook/rbac/bootstrap-roles ok[+]poststarthook/scheduling/bootstrap-system-priority-classes ok[+]poststarthook/priority-and-fairness-config-producer ok[+]poststarthook/start-cluster-authentication-info-controller ok[+]poststarthook/aggregator-reload-proxy-client-cert ok[+]poststarthook/start-kube-aggregator-informers ok[+]poststarthook/apiservice-registration-controller ok[+]poststarthook/apiservice-status-available-controller ok[+]poststarthook/kube-apiserver-autoregistration ok[+]autoregister-completion ok[+]poststarthook/apiservice-openapi-controller oklivez check passed
[+]ping ok[+]log ok[+]etcd ok[+]informer-sync ok[+]poststarthook/start-kube-apiserver-admission-initializer ok[+]poststarthook/generic-apiserver-start-informers ok[+]poststarthook/priority-and-fairness-config-consumer ok[+]poststarthook/priority-and-fairness-filter ok[+]poststarthook/start-apiextensions-informers ok[+]poststarthook/start-apiextensions-controllers ok[+]poststarthook/crd-informer-synced ok[+]poststarthook/bootstrap-controller ok[+]poststarthook/rbac/bootstrap-roles ok[+]poststarthook/scheduling/bootstrap-system-priority-classes ok[+]poststarthook/priority-and-fairness-config-producer ok[+]poststarthook/start-cluster-authentication-info-controller ok[+]poststarthook/aggregator-reload-proxy-client-cert ok[+]poststarthook/start-kube-aggregator-informers ok[+]poststarthook/apiservice-registration-controller ok[+]poststarthook/apiservice-status-available-controller ok[+]poststarthook/kube-apiserver-autoregistration ok[+]autoregister-completion ok[+]poststarthook/apiservice-openapi-controller ok[+]shutdown okreadyz check passed

查看集群信息:

kubectl cluster-info
Kubernetes control plane is running at https://192.168.31.221:6443CoreDNS is running at https://192.168.31.221:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxyTo further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.