kubeadm 部署 k8s
使用 kubeadm 进行 k8s 的部署主要分为以下几个步骤:
环境预装: 主要安装 docker,kubeadm 等相关工具.
集群部署: 集群部署分为 single master(单 master, 只有一个 master 节点)和高可用 HA 集群部署两种模式. 主要部署 k8s 的相关组件. 本文将分别做介绍.
网络部署: 部署网络环境. 本文以 flannel 为例进行部署.
环境预装
在所有节点上都先要做好环境的准备, 这里以 debian 为例, 整理了安装 docker 和 kubeadm 的相关命令. 这个里面主要需要解决的是国内源的问题.
- ## 准备环境
- swapoff -a
- systemctl stop firewalld
- systemctl disable firewalld
- echo "net.bridge.bridge-nf-call-ip6tables = 1
- net.bridge.bridge-nf-call-iptables = 1
- net.ipv4.ip_forward = 1"> /etc/sysctl.d/k8s.conf
- sysctl -p /etc/sysctl.d/k8s.conf
- modprobe br_netfilter
- ## 更换 apt 源
- mv /etc/apt/sources.list /etc/apt/sources.list.bak
- echo "deb http://mirrors.163.com/debian/ stretch main non-free contrib
- deb http://mirrors.163.com/debian/ stretch-updates main non-free contrib
- deb http://mirrors.163.com/debian/ stretch-backports main non-free contrib
- deb-src http://mirrors.163.com/debian/ stretch main non-free contrib
- deb-src http://mirrors.163.com/debian/ stretch-updates main non-free contrib
- deb-src http://mirrors.163.com/debian/ stretch-backports main non-free contrib
- deb http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib
- deb-src http://mirrors.163.com/debian-security/ stretch/updates main non-free contrib"> /etc/apt/sources.list
- ## 安装 docker
- apt-get update
- apt-get install \
- apt-transport-https \
- ca-certificates \
- curl \
- gnupg2 \
- software-properties-common -y --force-yes
- curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
- apt-key fingerprint 0EBFCD88
- add-apt-repository \
- "deb [arch=amd64] https://download.docker.com/linux/debian \
- $(lsb_release -cs) \
- stable"
- apt-get update
- apt-get install docker-ce containerd.io -y
- ## 使用阿里云安装 kubeadm
- curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
- cat <<EOF>/etc/apt/sources.list.d/kubernetes.list
- deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
- EOF
- apt-get update
- apt-get install -y kubelet kubeadm kubectl
- apt-mark hold kubelet kubeadm kubectl
- ## 关闭 swap
- echo "vm.swappiness=0">> /etc/sysctl.d/k8s.conf
- sysctl -p /etc/sysctl.d/k8s.conf
以上命令在所有节点上都需要执行下.
单 master 集群部署
单 master 集群部署是以一个节点作为 master 节点, 其他的节点作为 node 角色加入到集群中.
首先在 master 节点上, 通过 kubeadm 进行集群的初始化.
nodename 默认会使用 hostname, 这里使用 ip 作为 nodename, 在查看 node 节点时会更加直观一些.
这里面基本都使用的是国内的 azure 提供的镜像源, 镜像下载速度比较快一些
- cat <<EOF> /root/kubeadm-config.YAML
- apiVersion: kubeadm.k8s.io/v1beta1
- kind: InitConfiguration
- nodeRegistration:
- kubeletExtraArgs:
- pod-infra-container-image: gcr.azk8s.cn/google_containers/pause-amd64:3.1
- ---
- apiVersion: kubeadm.k8s.io/v1beta1
- kind: ClusterConfiguration
- imageRepository: gcr.azk8s.cn/google_containers
- kubernetesVersion: v1.14.2
- networking:
- podSubnet: 10.244.0.0/16
- EOF
- nodename=`ip -4 route get 8.8.8.8|head -n 1|awk -F '''{print $NF}'`
- echo $nodename
- kubeadm init --config=kubeadm-config.yaml --apiserver-advertise-address=kubemaster.cluster.local --node-name $nodename> kubeadm.log
- 在 master 中查看 kubeadm.log 中的最后几行, 可以看到其他节点加入集群的命令.
- root@i-5i2nhchleypb9h6oofb9h5suy:~# tail -n 5 kubeadm.log
- Then you can join any number of worker nodes by running the following on each as root:
- kubeadm join kubemaster.cluster.local:6443 --token br1lyz.kgnz5d6apvtcvdlg \
- --discovery-token-ca-cert-hash sha256:a8a80875b68ddd8d8e0cd794daa1b81a7893eebceca77c3d5f9074b2dc7e109b
- 这时切换到其他的 node 节点, 可以直接使用以下命令, 加入集群.
- nodename=`ip -4 route get 8.8.8.8|head -n 1|awk -F '''{print $NF}'`
- echo $nodename
- kubeadm join kubemaster.cluster.local:6443 --token bbnth6.tyxpf0ec27r5y5b8 \
- --discovery-token-ca-cert-hash sha256:5a9d6d25558c0e5031d4d6a69b555f0db8dd0ac7e798b9f823f7f33352748ae6 --node-name $nodename
node 节点全部加入后, 即完成节点的部署.
高可用 (HA) 集群部署
高可用集群目前支持两种拓扑结构, 一种是 etcd 在 master 节点中部署, 一种是 etcd 在另外的节点中进行部署. 在小规模集群中, 其实采用前者就可以了. 本文也是采用这种方式.
高可用集群一般需要三个以上的 master 节点组成, 以及若干个 node 节点组成. 其中 master 节点需要一个负载均衡器进行流量的分发. 但是在小规模集群中, 额外再部署一个负载均衡器无疑会增加部署的复杂度. 这里我使用了一个偷懒的方式, 就是不使用真实的负载均衡器, 而是使用域名. 这里我有三个节点, 我在每个节点的 / etc/hosts 中做了如下配置. 这样 kubemaster.cluster.local 就可以解析到三个节点上.
- 11.62.68.3 kubemaster.cluster.local
- 11.62.68.4 kubemaster.cluster.local
- 11.62.68.5 kubemaster.cluster.local
这里为了防止连接都压到同一台上, 可以在不同的节点上调整 hosts 中的配置顺序.
这里同前面相似, 用以下命令进行集群的初始化. 这里特别注意下在配置中同上面最大的区别在于加入了 controlPlaneEndpoint: "kubemaster.cluster.local:6443" 配置. 实现对于集群控制面的负载均衡器的配置.
- cat <<EOF> /root/kubeadm-config.YAML
- apiVersion: kubeadm.k8s.io/v1beta1
- kind: InitConfiguration
- nodeRegistration:
- kubeletExtraArgs:
- pod-infra-container-image: gcr.azk8s.cn/google_containers/pause-amd64:3.1
- ---
- apiVersion: kubeadm.k8s.io/v1beta1
- kind: ClusterConfiguration
- imageRepository: gcr.azk8s.cn/google_containers
- kubernetesVersion: v1.14.2
- controlPlaneEndpoint: "kubemaster.cluster.local:6443"
- networking:
- podSubnet: 10.244.0.0/16
- EOF
- nodename=`ip -4 route get 8.8.8.8|head -n 1|awk -F '''{print $NF}'`
- echo $nodename
- kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs --node-name $nodename> kubeadm.log
- 在完成初始化后, 可以查看相关日志. 可以看到同单 master 部署模式的情况不同, 高可用集群中有两个命令.
- root@i-5i2nhchleypb9h6oofb9h5suy:~# tail -n 15 kubeadm.log
- You can now join any number of the control-plane node running the following command on each as root:
- kubeadm join kubemaster.cluster.local:6443 --token woebfo.mwj26odtpe2q0taj \
- --discovery-token-ca-cert-hash sha256:a09c6ac9ff8da73e0d5e19cea1d0df524a7e289ef7b144a6ede2b0052da87edb \
- --experimental-control-plane --certificate-key b73eba61d73c35ca4de43b9dd10a7db88023cbd767c98cc1d19489829ea0fc03
- Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
- As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
- "kubeadm init phase upload-certs --experimental-upload-certs" to reload certs afterward.
- Then you can join any number of worker nodes by running the following on each as root:
- kubeadm join kubemaster.cluster.local:6443 --token woebfo.mwj26odtpe2q0taj \
- --discovery-token-ca-cert-hash sha256:a09c6ac9ff8da73e0d5e19cea1d0df524a7e289ef7b144a6ede2b0052da87edb
- 第一个是加入 master 的方式. 也就是说, 通过第一个命令加入后, 该节点将会作为 master 加入到集群中. 这里我们使用该命令即可将节点加入到 master 中, 作为 master 的节点之一.
- nodename=`ip -4 route get 8.8.8.8|head -n 1|awk -F '''{print $NF}'`
- echo $nodename
- kubeadm join kubemaster.cluster.local:6443 --token pcumbv.qwa7uwzr7m7cijxy \
- --discovery-token-ca-cert-hash sha256:bae4c6e70cc92cc6cba66bc96d48bf0c5a45fddf83e90b89eea519fc4bad16ac \
- --experimental-control-plane --certificate-key 33f387801d51c0a743353357b138cf4ad70fd3acaa7a6ccec9835627773f1cb7 --node-name $nodename
当然, 第二个同单 master 模式就相似了.
- nodename=`ip -4 route get 8.8.8.8|head -n 1|awk -F '''{print $NF}'`
- echo $nodename
- kubeadm join kubemaster.cluster.local:6443 --token woebfo.mwj26odtpe2q0taj \
- --discovery-token-ca-cert-hash sha256:a09c6ac9ff8da73e0d5e19cea1d0df524a7e289ef7b144a6ede2b0052da87edb --node-name $nodename
master 节点准备
在 master 节点上可以做一些相关的准备, 方便后面使用 kubectl 等命令.
- systemctl enable kubelet.service
- ## 为 kubectl 准备 config
- mkdir -p $HOME/.kube
- cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
- ## 去掉 master 的污点, 使得 master 节点也可以创建容器
- ## 该命令可选. 如果不想让 master 执行 node 的角色, 也可以不执行
- kubectl taint nodes --all node-role.kubernetes.io/master-
网络安装
这里使用 flannel 网络.
- mkdir -p ~/k8s/
- cd ~/k8s
- wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
- ## 这里使用 quay.azk8s.cn 进行进行加速. 该命令可选.
- sed -i "s/quay.io/quay.azk8s.cn/g" kube-flannel.YAML
- kubectl apply -f kube-flannel.YAML
测试
这里我们尝试在每个节点创建一个容器, 然后进行集群部署验证. 这里给了一个样例.
- cat <<EOF> /root/daemonset.YAML
- apiVersion: extensions/v1beta1
- kind: DaemonSet
- metadata:
- name: debian
- spec:
- template:
- metadata:
- labels:
- debian: debian
- spec:
- containers:
- - name: debian
- image: dockerhub.azk8s.cn/library/debian
- command: ["sleep", "999999d"]
- resources:
- requests:
- CPU: 100m
- memory: 100Mi
- EOF
- kubectl create -f /root/daemonset.YAML
这里我写了一个小工具可以自动进行各个节点的容器之间的网络验证, 自动统计哪些节点还没有正常运行. 后面我会再开源出来放到博客里.
清理命令
有时候安装失败或者清理环境时一些常用的命令, 也整理在了下面.
清理环境
该命令主要用于将 kubeadm 安装的本节点恢复到安装前. 需要输入 yes 确认. 该命令适用于 master 和 node 节点.
kubeadm reset
清理 cni0 网桥
重复安装有时候会导致 cni0 的配置错误, 可以通过删除 cni0 网桥, 然后重新创建实现故障恢复.
- apt-get install bridge-utils -y
- ifconfig cni0 down
- brctl delbr cni0
- systemctl restart kubelet
清理 iptables
kubeadm 清理时不会清理 iptables, 里面会有很多冗余的规则, 可以使用该命令清理. 该命令慎用.
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
清理 bridge 的残余信息
在使用 flannel 时, 有时 Mac 信息过时没能更新, 导致无法将消息转发到目标机器的 flannel.1. 可以在检查后, 通过 bridge 命令清理过期的 Mac 信息.
flannel 的具体原理和排障可以参考我之前的博客,《flannel vxlan 工作基本原理及常见排障思路》. 其中介绍更为详细.
- route -n
- arp -e
- bridge fdb show
- bridge fdb del 76:21:60:e5:ea:0b dev flannel.1
参考资料
- Creating a single master cluster with kubeadm https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/
- Options for Highly Available topology https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/ha-topology/
- Creating Highly Available clusters with kubeadm https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/high-availability/
来源: https://www.cnblogs.com/xuxinkun/p/11046551.html