Kubernetes 1.28.2 单 Master 部署
- 文档资料
- 服务架构
- 节点基础优化
-
- 清空防火墙策略
- 检查防火墙策略
- 关闭 swap
-
- 1. 临时关闭
- 2. 永久关闭
- 3. 检查 swap 状态
- 加载内核模块
-
- 1. 调整配置文件
- 2. 安装模块
- 调整内核参数
-
- 1. 创建配置文件
- 2. 生效配置
- 配置时间同步
-
- 1. 安装 Chrony 服务
- 2. 配置 Chrony 服务
- 3. 重启并将 Chrony 服务设置为开机自启
- 4. 检查 Chrony 服务状态
- 创建服务目录
- 安装 Containerd 服务
-
- 1. 配置 Containerd 的 yum 源
- 2. 更新 yum 源
- 3. 安装 Container 服务
- 4. 生成原始 Containerd 配置文件
- 5. 备份 Containerd 配置文件
- 6. 修改 Containerd 配置文件
- 7. 重启并将 Container 服务设置为开机自启
- 8. 验证 Container 服务是否正常运行
- 安装 Kubernetes 工具
-
- 1. 配置 Kubernetes 的 yum 源
- 2. 更新 yum 源
- 3. 安装 Kubernetes 工具
- 部署 Kubernetes Master
-
- 1. 生成原始 Kubernetes 配置文件
- 2. 备份 Kubernetes 配置文件
- 3. 修改 Kubernetes 配置文件
- 4. 拉取所需镜像
- 5. 安装 Kubernetes Master
- 6. 配置集群
- 部署 Kubernetes 网络
-
- 1. 安装网络插件 Calico
- 2. 检查 Pod 状态
- 3. 检查 Node 状态
- 添加 Kubernetes Worker
-
- 1. 生成 token
- 2. 添加 Kubernetes Worker
- 3. 查看添加结果
- 部署 Ingress 控制器 Ingress-Nginx
-
- 检查 Ingress-Nginx 状态
文档资料
- 阿里云 - Docker-CE 镜像地址:https://developer.aliyun.com/mirror/docker-ce
- 阿里云 - Kubernetes 镜像地址:https://developer.aliyun.com/mirror/kubernetes
- 官方 - 网络配置说明:https://kubernetes.io/docs/concepts/cluster-administration/addons/
- Calico - 网络插件安装说明:https://docs.tigera.io/calico/latest/getting-started/kubernetes/self-managed-onprem/onpremises#install-calico-with-kubernetes-api-datastore-50-nodes-or-less
- Ingress-Nginx 官方文档:https://github.com/kubernetes/ingress-nginx
- Ingress-Nginx 最新版本 deployment:https://github.com/kubernetes/ingress-nginx/blob/main/deploy/static/provider/baremetal/deploy.yaml
服务架构
主机名 | IP 地址 | 角色 |
---|---|---|
redis2 | 10.10.10.22 | control-plane/data-plan |
redis3 | 10.10.10.23 | data-plan |
hadoop2 | 10.10.10.132 | data-plan |
hadoop3 | 10.10.10.133 | data-plan |
节点基础优化
- 每个节点都需进行如下操作。
清空防火墙策略
- Kubernets 的端口映射和转发都是通过 iptables 服务完成,所以需要在安装 Kubernetes 之前,需要清空所有的 iptables 策略,以保证不会由于原有的防火墙策略,导致无法正常安装 Kubernetes。
iptables -F iptables -t nat -F
检查防火墙策略
- 所有的策略项都为空,则表示已清空所有防火墙策略。
iptables -L -v # 输出结果 Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
关闭 swap
1. 临时关闭
swapoff -a
2. 永久关闭
sed -i '/^[^#]/ s/(s+swaps)/#&/' /etc/fstab
3. 检查 swap 状态
- 当 swap 行的 total 为 0 时,表示已关闭所有的 swap。
free -g # 输出结果 total used free shared buff/cache available Mem: 15 8 0 0 6 6 Swap: 0 0 0
加载内核模块
- 如下内核模块主要用于将 kube-proyx 的代理模式从 iptables 切换至 ipvs。若无此需求,可不进行此操作。
1. 调整配置文件
cat > /etc/modules-load.d/modules.conf << EOF br_netfilter ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh nf_conntrack EOF
2. 安装模块
for line in $(cat /etc/modules-load.d/modules.conf); do modprobe $line; done
调整内核参数
1. 创建配置文件
- net.ipv4.ip_forward:启用 IPv4 数据包的转发;
- vm.swapiness:设置内核尽量不使用 swap;
- net.bridge.bridge-nf-call-iptables:启用桥接网络时,调用 iptables 进行过滤;
- net.bridge.bridge-nf-call-ip6tables:启用桥接网络时,调用 ip6tables进行过滤。
cat > /etc/sysctl.d/k8s.conf << EOF # Kubernetes net.ipv4.ip_forward = 1 vm.swapiness = 0 net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 EOF
2. 生效配置
sysctl -p /etc/sysctl.d/k8s.conf
配置时间同步
1. 安装 Chrony 服务
yum install chrony -y
2. 配置 Chrony 服务
- 如下配置中的 “server 10.10.10.21 iburst” 部分,可根据实际情况调整至可用的时间同步服务器。
cat > /etc/chrony.conf < EOF server 10.10.10.21 iburst driftfile /var/lib/chrony/drift makestep 1.0 3 rtcsync logdir /var/log/chrony EOF
3. 重启并将 Chrony 服务设置为开机自启
systemctl enable chrony --now
4. 检查 Chrony 服务状态
- 输出的所有时间同步服务器中,只有状态为 * 的服务器,才表示能够正常工作。
chronyc sources -v # 输出结果 210 Number of sources = 1 .-- Source mode '^' = server, '=' = peer, '#' = local clock. / .- Source state '*' = current synced, '+' = combined , '-' = not combined, | / '?' = unreachable, 'x' = time may be in error, '~' = time too variable. || .- xxxx [ yyyy ] +/- zzzz || Reachability register (octal) -. | xxxx = adjusted offset, || Log2(Polling interval) --. | | yyyy = measured offset, || | | zzzz = estimated error. || | | MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== ^* redis1 4 6 377 18 +1539us[+1549us] +/- 63ms
创建服务目录
mkdir -p /data/service/kubernetes
安装 Containerd 服务
1. 配置 Containerd 的 yum 源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
2. 更新 yum 源
yum clean all && yum makecache fast
3. 安装 Container 服务
- 若环境中已安装 Docker-CE,由于 Docker-CE 基于 Containerd,所以无需再次安装,直接使用即可。
yum install containerd.io -y
4. 生成原始 Containerd 配置文件
mkdir -p /etc/containerd containerd config default > /etc/containerd/config.toml
5. 备份 Containerd 配置文件
cp /etc/containerd/config.toml /etc/containerd/config.toml.orig
6. 修改 Containerd 配置文件
# 将镜像仓库地址调整为阿里云地址,以保证能够拉取到镜像 # 第 62 行,修改为如下配置 sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9" # 使用 systemd 作为容器的 cgroup driver,以保证节点资源紧张时更加稳定 # 第 126 行,修改为如下配置 SystemdCgroup = true
7. 重启并将 Container 服务设置为开机自启
systemctl enable containerd --now
8. 验证 Container 服务是否正常运行
- 有输出,则表示服务已正常运行
ctr version # 输出结果 Client: Version: 1.6.25 Revision: d8f198a4ed8892c764191ef7b3b06d8a2eeb5c7f Go version: go1.20.10 Server: Version: 1.6.25 Revision: d8f198a4ed8892c764191ef7b3b06d8a2eeb5c7f UUID: 0218e80c-c56f-4b65-98bb-48a44120978c
安装 Kubernetes 工具
1. 配置 Kubernetes 的 yum 源
cat > /etc/yum.repos.d/kubernetes.repo << EOF [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
2. 更新 yum 源
yum clean all && yum makecache fast
3. 安装 Kubernetes 工具
yum install kubelet kubeadmin kubectl -y
部署 Kubernetes Master
- 基于上述的服务架构的规划,Master 需部署在 redis2 节点上。
1. 生成原始 Kubernetes 配置文件
kubeadm config print init-defaults > /data/service/kubernetes/kubeadm.yaml
2. 备份 Kubernetes 配置文件
cp /data/service/kubernetes/kubeadm.yaml /data/service/kubernetes/kubeadm.yaml.orig
3. 修改 Kubernetes 配置文件
# 此 IP 为 Master 节点的 IP 地址 # 第 12 行,修改为如下配置 advertiseAddress: 10.10.10.22 # 设置 containerd 的连接套接字 # 第 15 行,修改为如下配置 criSocket: unix:///var/run/containerd/containerd.sock # 此名称为 Master 节点的主机名 # 第 17 行,修改为如下配置 name: redis2 # 将镜像仓库地址调整为阿里云地址,以保证能够拉取到镜像 # 第 30 行,修改为如下配置 imageRepository: registry.aliyuncs.com/google_containers # 指定 pod 的 IP 网段 # 在第 35 行后,添加如下配置 podSubnet: 10.244.0.0/16
- 配置文件样例
apiVersion: kubeadm.k8s.io/v1beta3 bootstrapTokens: - groups: - system:bootstrappers:kubeadm:default-node-token token: abcdef.0123456789abcdef ttl: 24h0m0s usages: - signing - authentication kind: InitConfiguration localAPIEndpoint: advertiseAddress: 10.10.10.22 bindPort: 6443 nodeRegistration: criSocket: unix:///var/run/containerd/containerd.sock imagePullPolicy: IfNotPresent name: redis2 taints: null --- apiServer: timeoutForControlPlane: 4m0s apiVersion: kubeadm.k8s.io/v1beta3 certificatesDir: /etc/kubernetes/pki clusterName: kubernetes controllerManager: {} dns: {} etcd: local: dataDir: /var/lib/etcd imageRepository: registry.aliyuncs.com/google_containers kind: ClusterConfiguration kubernetesVersion: 1.28.0 networking: dnsDomain: cluster.local serviceSubnet: 10.96.0.0/12 podSubnet: 10.244.0.0/16 scheduler: {}
4. 拉取所需镜像
kubeadm config images pull --config /data/service/kubernetes/kubeadm.yaml
5. 安装 Kubernetes Master
kubeadm init --config /data/service/kubernetes/kubeadm.yaml # 输出结果 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 10.10.10.22:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:cad3fa778559b724dff47bb1ad427bd39d97dd76e934b9467507a2eb990a50c7
6. 配置集群
mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config
部署 Kubernetes 网络
- Kubernetes Master 部署完成后,当通过命令查看集群状态时,会发现如下异常:
- 通过 kubectl get nodes,会发现 master 的状态一直处于 notready;
- 通过 kubectl get pods -n kube-system,会发现 pod coredns 的状态也一直处于 notready。
- 此异常主要由于未安装网络插件导致。而 Kubernetes 支持多种网络插件,此文档所选用的是最常见的网络插件 Calico。
- 基于上述的服务架构的规划,需在 redis2 节点上进行如下操作。
1. 安装网络插件 Calico
# 获取 yaml 文件 curl https://breezey-public.oss-cn-zhangjiakou.aliyuncs.com/cka/calico.yaml -o /data/service/kubernetes/calico.yaml # 部署网络插件 Calico kubectl apply -f /data/service/kubernetes/calico.yaml
2. 检查 Pod 状态
- 所有的 Pod 都已正常进入 Running 状态
kubectl get pods -n kube-system -o wide # 输出结果 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES calico-kube-controllers-78496c69f6-bcqf9 1/1 Running 0 11d 10.244.214.65 redis2 <none> <none> calico-node-4gqff 1/1 Running 0 11d 10.10.10.22 redis2 <none> <none> coredns-66f779496c-bb72k 1/1 Running 0 11d 10.244.214.66 redis2 <none> <none> coredns-66f779496c-pqfw7 1/1 Running 0 11d 10.244.214.67 redis2 <none> <none> etcd-redis2 1/1 Running 0 11d 10.10.10.22 redis2 <none> <none> kube-apiserver-redis2 1/1 Running 0 11d 10.10.10.22 redis2 <none> <none> kube-controller-manager-redis2 1/1 Running 0 11d 10.10.10.22 redis2 <none> <none> kube-proxy-f4wf2 1/1 Running 0 11d 10.10.10.22 redis2 <none> <none> kube-scheduler-redis2 1/1 Running 0 11d 10.10.10.22 redis2 <none> <none>
3. 检查 Node 状态
- 所有的 Node 都已正常进入 Ready 状态
kubectl get nodes # 输出结果 NAME STATUS ROLES AGE VERSION redis2 Ready control-plane 11d v1.28.2
添加 Kubernetes Worker
1. 生成 token
- token 是添加集群的认证信息。
- 每个 token 的有效时间为 24 小时。超时后,token 将无法再被使用,需要通过如下命令再次生成。
- 基于上述的服务架构的规划,需在 redis2 节点上进行如下操作。
kubeadm token create --print-join-command # 输出结果 kubeadm join 10.10.10.22:6443 --token w9g299.f9dymq7iza6h97s1 --discovery-token-ca-cert-hash sha256:5ec5a1e20cb9282f763c8aadb640e32f5a6e542df2ab7383125bd3334ab97521
2. 添加 Kubernetes Worker
- 需在将要加到集群内的节点上运行。基于上述部署架构,需在 redis3、hadoop2 和 hadoop3 节点上运行
kubeadm join 10.10.10.22:6443 --token w9g299.f9dymq7iza6h97s1 --discovery-token-ca-cert-hash sha256:5ec5a1e20cb9282f763c8aadb640e32f5a6e542df2ab7383125bd3334ab97521
3. 查看添加结果
kubectl get nodes # 输出结果 NAME STATUS ROLES AGE VERSION hadoop2 Ready <none> 11d v1.28.2 hadoop3 Ready <none> 11d v1.28.2 redis2 Ready control-plane 12d v1.28.2 redis3 Ready <none> 11d v1.28.2 kubectl get pods -n kube-system -o wide # 输出结果 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES calico-kube-controllers-78496c69f6-bcqf9 1/1 Running 0 12d 10.244.214.65 redis2 <none> <none> calico-node-452ps 1/1 Running 0 11d 10.10.10.132 hadoop2 <none> <none> calico-node-4gqff 1/1 Running 0 12d 10.10.10.22 redis2 <none> <none> calico-node-lv4sg 1/1 Running 0 11d 10.10.10.23 redis3 <none> <none> calico-node-wc2hw 1/1 Running 0 11d 10.10.10.133 hadoop3 <none> <none> coredns-66f779496c-bb72k 1/1 Running 0 12d 10.244.214.66 redis2 <none> <none> coredns-66f779496c-pqfw7 1/1 Running 0 12d 10.244.214.67 redis2 <none> <none> etcd-redis2 1/1 Running 0 12d 10.10.10.22 redis2 <none> <none> kube-apiserver-redis2 1/1 Running 0 12d 10.10.10.22 redis2 <none> <none> kube-controller-manager-redis2 1/1 Running 0 12d 10.10.10.22 redis2 <none> <none> kube-proxy-8882t 1/1 Running 0 11d 10.10.10.132 hadoop2 <none> <none> kube-proxy-8v5vq 1/1 Running 0 11d 10.10.10.23 redis3 <none> <none> kube-proxy-f4wf2 1/1 Running 0 12d 10.10.10.22 redis2 <none> <none> kube-proxy-vst9n 1/1 Running 0 11d 10.10.10.133 hadoop3 <none> <none> kube-scheduler-redis2 1/1 Running 0 12d 10.10.10.22 redis2 <none> <none>
部署 Ingress 控制器 Ingress-Nginx
-
可通过官方地址,获取最新版本的 ingress-nginx deployment。而此文档所使用的版本为 1.9.3。
-
基于上述的服务架构的规划,需在 redis2 节点上进行如下操作。
# 获取 yaml 文件 wget https://breezey-public.oss-cn-zhangjiakou.aliyuncs.com/cka/ingress-nginx-v1.9.3.yaml -O /data/service/kubernetes/ingress-nginx.yaml # 调整配置文件 # 使用宿主机 IP 地址 Pod 的 IP 地址 # 在 139 行后,添加如下配置 hostNetwork: true # 部署控制器 Ingress-Nginx kubectl apply -f /data/service/kubernetes/ingress-nginx.yaml
检查 Ingress-Nginx 状态
- 自动创建 Namespace ingress-nginx
kubectl get ns | grep ingress-nginx # 输出结果 ingress-nginx Active 108s
- 完成 ingress-nginx 的 Pod 创建
- Pod 所使用的 IP 地址为宿主机 IP 地址
kubectl get pods -n ingress-nginx -o wide | grep "ingress-nginx-controller" # 输出结果 ingress-nginx-controller-769b6777ff-nnkf4 1/1 Running 0 4m40s 10.10.10.23 redis3 <none> <none>