Kubernetes 1.28.2 单 Master 部署

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>