乐趣区

关于kubernetes:用-kubeadm-在-Debian-或-Ubuntu-中创建-k8s-集群

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

一、筹备

要遵循本指南,你须要:

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

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

# k8s cluster nodes start
192.168.31.221 k8s-master
192.168.31.222 k8s-node-1
192.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.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo 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 update
    sudo 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 main
    EOF

这里须要留神,kubernetes-xenial不扭转,版本代码一扭转,将无奈在 apt 仓库中找到 kubeadm 和 kubelet。而 apt 仓库中保留的是通用 DEB 包,Debian 和 Ubuntu 不辨别版本都能够用,所以不要改变此处。我用的是 Debian 9,将其改为 kubernetes-stretch 后就遇到了此问题,改为 kubernetes-xenial 才顺利装置。

  1. 更新 apt 包索引,装置 kubelet、kubeadm 和 kubectl,并锁定其版本:

    sudo apt-get update
    sudo apt-get install -y kubelet kubeadm kubectl
    sudo apt-mark hold kubelet kubeadm kubectl

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

2 创立集群

2.1 查看 kubeadm 初始化所需镜像

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

➜  ~ kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.21.1
k8s.gcr.io/kube-controller-manager:v1.21.1
k8s.gcr.io/kube-scheduler:v1.21.1
k8s.gcr.io/kube-proxy:v1.21.1
k8s.gcr.io/pause:3.4.1
k8s.gcr.io/etcd:3.4.13-0
k8s.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-reload
sudo 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/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You 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/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

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

➜  ~ kubectl get nodes
NAME         STATUS   ROLES                  AGE     VERSION
k8s-master   Ready    control-plane,master   10m     v1.21.1
k8s-node-1   Ready    <none>                 9m26s   v1.21.1
k8s-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   AGE
coredns-54695bfdf-24whr              1/1     Running   0          29m
coredns-54695bfdf-p8knz              1/1     Running   0          29m
etcd-k8s-master                      1/1     Running   0          29m
kube-apiserver-k8s-master            1/1     Running   0          29m
kube-controller-manager-k8s-master   1/1     Running   0          29m
kube-flannel-ds-4w2lt                1/1     Running   0          16s
kube-flannel-ds-7x9w7                1/1     Running   0          16s
kube-flannel-ds-rgcxl                1/1     Running   0          16s
kube-proxy-gtf4d                     1/1     Running   0          29m
kube-proxy-pvhbp                     1/1     Running   0          28m
kube-proxy-s6xj9                     1/1     Running   0          28m
kube-scheduler-k8s-master            1/1     Running   0          29m

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

curl -k https://localhost:6443/livez\?verbose
curl -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 ok
livez 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 ok
readyz check passed

查看集群信息:

kubectl cluster-info
Kubernetes control plane is running at https://192.168.31.221:6443
CoreDNS is running at https://192.168.31.221:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
退出移动版