前戏
ip | 描述 | |
10.6.215.30 | master1 | |
10.6.215.31 | master2 | |
10.6.215.32 | node1 | |
10.6.215.33 | node2 |
给四台主机分别设置 hostname,后面会根据 hostname 来生成名称
# 每个节点分别设置对应主机名 hostnamectl set-hostname master1 # 在 10.6.215.30 上执行 hostnamectl set-hostname master2 # 在 10.6.215.31 上执行 hostnamectl set-hostname node1 # 在 10.6.215.32 上执行 hostnamectl set-hostname node2 # 在 10.6.215.33 上执行
所有节点都修改 hosts
# 所有节点都修改 hosts vim /etc/hosts 10.6.215.30 master1 10.6.215.31 master2 10.6.215.32 node1 10.6.215.33 node2
或者使用追加方式
cat <<EOF >> /etc/hosts 10.6.215.30 master1 10.6.215.31 master2 10.6.215.32 node1 10.6.215.33 node2 EOF
修改完成之后,去 ping 一下,master1 ping node1/node2
以及 node1 ping master1/master2/node2,node2 ping master1/master2/node1,如果都可以 ping 成功,则 host 配置的没问题
Kubernetes 安装
下面命令在所有节点执行
下面命令在所有节点执行
下面命令在所有节点执行
关闭 swap
禁用交换分区。为了保证 kubelet 正常工作,你必须禁用交换分区。详情见 安装 kubeadm
# 所有节点执行 [root@master1 opt]# swapoff -a [root@master1 opt]# sed -i 's/.*swap.*/#&/' /etc/fstab
关闭 SELinux
为了避免一些权限上的麻烦,我们直接关闭 SELinux,关闭 SELinux 实际上是不可取的,它相对不安全,不建议在生产环境这样做.
# 所有节点执行 [root@master1 opt]# setenforce 0 [root@master1 opt]# sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
关闭 firewalld
kubernetes 的运行需要 linux 开放一些端口,详情见 检查所需端口 你可以精确的只打开所需的端口,这样更安全。我为了方便直接关闭了防火墙,实际上是不安全的,不建议在生产环境这样做.
# 所有节点执行 [root@master1 opt]# systemctl disable firewalld [root@master1 opt]# systemctl stop firewalld
配置 Kubernetes
详情见 Install and configure prerequisites。我们需要提前配置好 kubernetes 的一些通用配置项
# 所有节点执行 [root@master1 opt]# cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF
# 所有节点执行 [root@master1 opt]# modprobe overlay [root@master1 opt]# modprobe br_netfilter
# 所有节点执行 [root@master1 opt]# cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1 EOF
让我们的配置生效
# 所有节点安装 [root@master1 opt]# sysctl --system
containerd 安装
Kubernates 中 pod 的运行必须有容器运行环境,以前 kubernetes 是使用 Docker,后面主要使用 containerd 等,目前支持的运行时可以参考 container-runtimes
本文使用 containerd,前面我们也讲过 Docker 也是基于 containerd 的,那么我们直接使用 Docker 的安装源,只安装 containerd 就行
移除可能安装过的 Docker 包
# 所有节点 [root@master1 opt]# sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
安装 yum-utils
# 所有节点执行 [root@master1 opt]# sudo yum install -y yum-utils
添加 docker 软件源
# 所有节点执行 [root@master1 opt]# sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
安装 containerd
# 所有节点执行 sudo yum install containerd.io -y
设置 containerd 开机自启动
# 所有节点执行 [root@master1 opt]# systemctl enable containerd [root@master1 opt]# systemctl start containerd
修改 containerd 使用 systemd
# 所有节点执行 [root@master1 opt]# containerd config default > /etc/containerd/config.toml [root@master1 opt]# sed -i 's#k8s.gcr.io#registry.aliyuncs.com/google_containers#g' /etc/containerd/config.toml [root@master1 opt]# sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
重启 containerd
# 所有节点执行 [root@master1 opt]# systemctl daemon-reload [root@master1 opt]# systemctl enable --now containerd [root@master1 opt]# systemctl restart containerd
安装 Kubernetes 组件
配置软件源,这里使用 aliyun 的源,官方的源是 google 的,没法在国内访问
# 所有节点执行 [root@master1 opt]# cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF
安装kubelet
,kubeadm
,kubectl
# 所有节点执行 [root@master1 opt]# yum install kubelet kubeadm kubectl --nogpgcheck -y
设置kubelet
自启动
# 所有节点执行 [root@master1 opt]# systemctl enable kubelet
安装crictl
# 所有节点执行 [root@master1 opt]# VERSION="v1.23.0" [root@master1 opt]# curl -L https://github.com/kubernetes-sigs/cri-tools/releases/download/$VERSION/crictl-${VERSION}-linux-amd64.tar.gz --output crictl-${VERSION}-linux-amd64.tar.gz
设置crictl
# 所有节点执行 [root@master1 opt]# crictl config --set runtime-endpoint=unix:///run/containerd/containerd.sock
初始化集群,只在 master 上执行
# 在担任 master 的 k8s 节点上执行,使用 kubeadm 初始化集群 # 这里 apiserver-advertise-address 的值是 master 的主机的 ip [root@master1 opt]# kubeadm init --apiserver-advertise-address=10.6.215.50 --image-repository registry.aliyuncs.com/google_containers
在全部的 worker 节点上执行我红框内的部分,加入集群
# 只在 node 节点上执行 [root@node1 ~]# kubeadm join 10.6.215.50:6443 --token 1snv5t.ts4a8tlpa99xeeym \ --discovery-token-ca-cert-hash sha256:a24b8eeaa555ed1e4f9a92c6404a611a030cb581a1fb423c360afb38e24cd781
配置网络插件 calico
节点加入集群后,起初是NotReady
的,这是正常的,我们配置好网络就行,在担任 master
节点上执行执行下面的命令,等待一段时间全部节点就会处于Ready
状态
[root@master1 opt]# kubectl get nodes NAME STATUS ROLES AGE VERSION master1 NotReady control-plane 47s v1.25.2 node1 NotReady <none> 19s v1.25.2 node2 NotReady <none> 2s v1.25.2
安装 calico 插件
# 只在 master 上执行 [root@master1 opt]# kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
等待中,没有节点是Ready
的,不要着急等一段时间就全部Ready
了
[root@master1 opt]# kubectl get node NAME STATUS ROLES AGE VERSION master1 Ready control-plane 5m23s v1.25.2 node1 Ready <none> 4m55s v1.25.2 node2 Ready <none> 4m38s v1.25.2