例如设置ip为192.168.0.10,host: k8s.master,其他分别为
k8s.s11 192.168.0.11
k8s.s12 192.168.0.12
....
hostname可以使用命令配置
hostname k8s.master
ip解析可以在hosts文件中写入,如果有内部dns解析可以在内部dns上解析
关闭firewalld和selinux
注意:尽量保持多台服务器安装的应用版本一致
我采用的版本为:
kubeadm |
1.23.6 |
kubectl |
1.23.6 |
kubelet |
1.23.6 |
docker |
23.0.1(k8s会提示没有验证过,可以使用Latest validated version: 20.10) |
暂时禁用
swapoff -a
长期关闭,可以在/etc/fstab文件中注释,重启服务器
考虑到服务器配置可能他人修改或被系统默认调整,建议设置 /etc/sysctl.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
如果不设置可能导致 [ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1等网络错误。
bridge.bridge-nf-call-ip6tables/bridge.bridge-nf-call-iptables设置原因
不管是 iptables 还是 ipvs 模式,Kubernetes 中访问 service 都会进行 DNAT,将原本访问 ClusterIP:Port 的数据包 DNAT 成 service 的某个 Endpoint (PodIP:Port),然后内核将连接信息插入 conntrack 表以记录连接,目的端回包的时候内核从 conntrack 表匹配连接并SNAT,这样原路返回形成一个完整的连接链路.
net.ipv4.ip_forward:出于安全考虑,Linux系统默认是禁止数据包转发的。
k8s中的三层扁平网络涉及到流量在不同网络设备之间的传递,比如:flannel的实现中,流量会在cni网桥,flannel.1设备,本机网卡设备之间传递流量。如果关闭,则流量无法在多个物理网络设备间传递。
0:表示禁止进行IP转发;
1:表示IP转发功能已经打开。
net.ipv4.ip_nonlocal_bind:此参数表示是否允许服务绑定一个本机不存在的IP地址;
使用场景:有些服务需要依赖一个vip才能启动,但是此vip不在本机上,当vip飘移到本机上时才存在;但是服务又需要提前启动,例如haproxy,nginx等代理需要绑定vip时;
0:默认值,表示不允许服务绑定一个本机不存的地址
1:表示允许服务绑定一个本机不存在的地址
vm.swappiness值越大,表示越积极使用swap分区,越小表示越积极使用物理内存;设置为0会禁止使用swap.需要根据服务器运行的程序类型,来设置不同的参数值。例如,对于Oracle一般设置为10;对于MySQL一般设置为1,尽可能不用swap分区。
安装依赖镜像
docker pull coredns/coredns:1.8.4
docker tag coredns/coredns:1.8.4 registry.dev.com/coredns:v1.8.4
docker images
初始化
kubeadm init \
--apiserver-advertise-address=192.168.0.10 \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
如果master需要开启swap,还需要修改 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf kubelet 的启动文件的配置 :在启动命令ExecStart末尾加上: --fail-swap-on=false
然后重新加载配置:
systemctl daemon-reload
systemctl start kubelet
初始成功后有提示加入语句:
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.0.10:6443 --token 42mf2r.n3jvn26r34byvv9b \
--discovery-token-ca-cert-hash sha256:775a36110dd28b84c3ac074657efc55a899cff77a019a9e2475f1bd0f579b535
按照提示完成master设置
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubeadm join 192.168.0.10:6443 --token 42mf2r.n3jvn26r34byvv9b \
--discovery-token-ca-cert-hash sha256:775a36110dd28b84c3ac074657efc55a899cff77a019a9e2475f1bd0f579b535
如果子节点没有关闭swap,可以添加 --ignore-preflight-errors=Swap
在主节点上使用命令查询节点情况
kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s.master NotReady control-plane,master 94m v1.23.6
k8s.s11 NotReady 71m v1.23.6
NotReady 说明master和node节点之间的通信还是有问题的,容器之间通信还没有准备好
Flannel是一个专为kubernetes定制的三层网络解决方案,主要用于解决容器的跨主机通信问题。
Flannel为每个主机提供独立的子网,整个集群的网络信息存储在etcd上。对于跨主机的转发,目标容器的IP地址,需要从etcd获取。
首先下载kube-flannel.yml 配置文件
https://github.com/flannel-io/flannel/blob/master/Documentation/kube-flannel.yml
安装flannel插件
kubectl apply -f kube-flannel.yml
在通过第7步方法,检查节点情况,如果STATUS为Ready就表示服务器部署成功。