kubeadm实现在aarch64上部署k8s1.28.4

297 阅读6分钟

1 基础环境部署

]# kubectl version
Client Version: v1.28.2
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.28.7

1.1 环境及软件版本信息

  • 服务器架构:aarch64 (鲲鹏920)
  • 操作系统:CentOS 7.8 ×86_64
  • docker: 25.0.4
  • cri-dockerd 0.3.2
  • kubeadm、kubectl、kubelet:v1.28.2
  • kubernetes:v1.28.7
  • flannel:v0.24.0

1.2 基础环境配置

主机名规划

序号主机ip主机名规划
110.0.0.12k8s-master
210.0.0.15k8s-node1
310.0.0.16k8s-node2

跨主机免密码认证

# 生成秘钥对
ssh-keygen -t rsa 

# 跨主机免密码认证
ssh-copy-id root@远程主机ip地址

Swap环境配置(所有主机操作)

临时禁用
swapoff -a

永久禁用
sed -i 's/.*swap.*/#&/' /etc/fstab 

内核参数调整
cat >> /etc/sysctl.d/k8s.conf << EOF
vm.swappiness=0
EOF
sysctl -p /etc/sysctl.d/k8s.conf

网络参数调整(所有主机操作)

配置iptables参数,使得流经网桥的流量也经过iptables/netfilter防火墙
cat >> /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

配置生效
modprobe br_netfilter
modprobe overlay
sysctl -p /etc/sysctl.d/k8s.conf

1.3 容器环境操作(所有主机操作)

注意:所有主机操作

部署docker软件源

定制软件源
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装最新版docker
yum list docker-ce --showduplicates | sort -r
yum install -y docker-ce
systemctl enable docker
systemctl start docker

docker加速器配置

配置加速器文件
]# vim >> /etc/docker/daemon.json
{
   #镜像源管理
  "registry-mirrors": [
    "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com",
    "https://docker.mirrors.ustc.edu.cn"
  ], 
  #docker私服配置,此次安装未配置
  #"insecure-registries": ["xx.xx.com"], 
  
  "exec-opts": ["native.cgroupdriver=systemd"]
}


重启docker服务
systemctl restart docker

docker-compose安装

yum install -y docker-compose

1.4 cri环境操作(所有主机操作)

注意:需要获取arm64架构对应的包

获取软件

下载软件
mkdir /data/softs && cd /data/softs
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.2/cri-dockerd-0.3.2.arm64.tgz

解压软件
tar xf cri-dockerd-0.3.2.arm64.tgz
mv cri-dockerd/cri-dockerd /usr/local/bin/

检查效果
cri-dockerd --version

配置文件定制

# 配置 cri-dockerd.service
]# vim /etc/systemd/system/cri-dockerd.service

[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/local/bin/cri-dockerd --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9
 --network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock --cri-dockerd-root-directory=/var/lib/dockershim --docker-endpoint=unix:///var/run/docker.sock --cri-dockerd-root-directory=/var/lib/docker
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target

配置 cri-dockerd.socket
]# vim /etc/systemd/system/cri-dockerd.socket
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service

[Socket]
ListenStream=/var/run/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker

[Install]
WantedBy=sockets.target

设置服务开机自启动

设置服务开机自启动
systemctl daemon-reload
systemctl enable cri-dockerd.service
systemctl restart cri-dockerd.service

2 k8s集群安装

2.1 k8s集群初始化

软件部署注意:baseurl为arm架构的包

配置阿里云的关于kubernetes的软件源
]# vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-aarch64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg


更新软件源
yum makecache fast

master节点环境软件部署

master节点环境软件部署
yum install kubeadm kubectl kubelet -y

node节点环境软件部署

node节点环境软件部署
yum install kubeadm kubectl kubelet -y

确认基本配置

检查镜像文件列表
]# kubeadm config images list

获取镜像文件
]# images=$(kubeadm config images list --kubernetes-version=1.28.7 | awk -F "/" '{print $NF}')
]# for i in ${images}
do   
	docker pull registry.aliyuncs.com/google_containers/$i 
    docker tag registry.aliyuncs.com/google_containers/$iregistry.k8s.io/$i
    docker rmi registry.aliyuncs.com/google_containers/$i
done

master节点初始化

# 在初始化之前,我们可以执行kubeadm init --help命令查看相关参数用法,具体如下:
# apiserver-advertise-address:指定apiserver的IP,即master节点的IP,本文是10.0.0.6
# image-repository:设置镜像仓库为国内镜像仓库
# kubernetes-version:设置k8s的版本,必须跟kubeadm版本一致
# service-cidr:设置node节点的网络,可以保持原样
# pod-network-cidr:这是设置node节点的网络,可以保持原样
# cri-socket:设置cri使用cri-dockerd

环境初始化命令
kubeadm init --kubernetes-version=1.28.7 \
--apiserver-advertise-address=10.0.0.6 \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=Swap \
--cri-socket=unix:///var/run/cri-dockerd.sock

node节点加入集群

复制join命令,加入到master集群       
]# kubeadm join 10.0.0.6:6443 --token fzkrd0.okf2pgojncx8o00l \
--cri-socket unix:///var/run/cri-dockerd.sock --discovery-token-ca-cert-hash sha256:29aedfb58c2e839ef06bf1c127a13372d592ca52c92171103096725b17345335

# 如果上面的令牌忘记了,或者有新的node节点加入,在master节点上执行下面的命令,生成新的令牌
]# kubeadm token create --print-join-command

2.6 k8s环境收尾操作

权限操作

定制kubernetes的登录权限
]# mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf

命令补全

放到master主机的环境文件中
echo "source <(kubectl completion bash)" >> ~/.bashrc
echo "source <(kubeadm completion bash)" >> ~/.bashrc
source ~/.bashrc
# 赋读写权限
chmod 666 /etc/kubernetes/admin.conf
# 配置环境变量并使之生效
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile

3.0安装Flannel网络插件(所有主机操作)

注意:所有主机操作 在上一节中查看集群节点时都是NotReady状态,我们提到是因为未安装网络插件,节点之间无法通信造成的。首先简单说一下在kubernetes中主流的一些网络插件,比如Flannel、Calico、Weave、Cilium等等,这些网络插件提供了不同的功能特性和性能特点,大家若想继续深入了解可自行去网上查阅。我们这次选择的是Flannel,接下来就以Flannel为例进行搭建说明。

3.1下载镜像及配置文件

在联网的机器上执行以下命令下载kube-flannel.yml文件,如下所示。

 wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
# 更改network地址,是初始化时的pod地址范围
]vim kube-flannel.yml
 ...
 net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }
 ...
]cat kube-flannel.yml | grep image
        image: docker.io/flannel/flannel:v0.24.3
        image: docker.io/flannel/flannel-cni-plugin:v1.4.0-flannel1
        image: docker.io/flannel/flannel:v0.24.3

3.2安装flannel

把下载好的kube-flannel.yml及镜像上传至所有节点服务器的/k8s/flannel目录下,执行以下命令进行安装,如下所示。

# 加载镜像
find /k8s/flannel -type f -name "*.tar" -exec docker load -i {} ;

# 安装flannel
cd /k8s/flannel
kubectl apply -f kube-flannel.yml

安装完成以后,再次查看集群节点以及pod运行状态,一切正常!

[root@k8s-master flannel]# kubectl get nodes
NAME      STATUS   ROLES           AGE   VERSION
k8s-node1   Ready    <none>          22d   v1.28.2
k8s-node2   Ready    <none>          22d   v1.28.2
k8s-master   Ready    control-plane   22d   v1.28.2

[root@k8s-master flannel]# kubectl get pods -A
NAMESPACE      NAME                              READY   STATUS    RESTARTS      AGE
kube-flannel   kube-flannel-ds-8zqhs             1/1     Running   1 (22d ago)   22d
kube-flannel   kube-flannel-ds-qbt6z             1/1     Running   0             22d
kube-flannel   kube-flannel-ds-vsm4q             1/1     Running   0             22d
kube-system    coredns-6554b8b87f-jc8td          1/1     Running   2 (22d ago)   22d
kube-system    coredns-6554b8b87f-t2fzb          1/1     Running   2 (22d ago)   22d
kube-system    etcd-dsjpt06                      1/1     Running   1 (22d ago)   22d
kube-system    kube-apiserver-dsjpt06            1/1     Running   2 (22d ago)   22d
kube-system    kube-controller-manager-dsjpt06   1/1     Running   1 (22d ago)   22d
kube-system    kube-proxy-6zt7s                  1/1     Running   0             22d
kube-system    kube-proxy-jqwf9                  1/1     Running   1 (22d ago)   22d
kube-system    kube-proxy-q94hb                  1/1     Running   0             22d
kube-system    kube-scheduler-dsjpt06            1/1     Running   1 (22d ago)   22d

4、常用命令

  1. 集群管理

    • kubectl cluster-info:显示集群的相关信息。
  2. 节点管理

    • kubectl get nodes:列出集群中的所有节点。
    • kubectl describe node <node-name>:显示指定节点的详细信息。
    • kubectl drain <node-name>:准备节点进行维护,排除调度。
    • kubectl cordon <node-name>:标记节点不可调度。
  3. Pods管理

    • kubectl get pods:列出所有命名空间中的Pods。
    • kubectl get pods -n <namespace>:列出特定命名空间中的Pods。
    • kubectl describe pod <pod-name>:显示指定Pod的详细信息。
    • kubectl logs <pod-name>:显示Pod的日志。
    • kubectl exec <pod-name> -- <command>:在Pod内部执行命令。
    • kubectl delete pod <pod-name>:删除指定的Pod。
  4. 服务(Service)和负载均衡(LoadBalancer)

    • kubectl get services:列出所有的服务。
    • kubectl describe service <service-name>:显示指定服务的详细信息。
    • kubectl expose pod <pod-name> -port=<port>:将Pod暴露为服务。
  5. 部署(Deployment)管理

    • kubectl get deployments:列出所有的部署。
    • kubectl describe deployment <deployment-name>:显示指定部署的详细信息。
    • kubectl scale deployment <deployment-name> --replicas=<num-replicas>:设置部署的副本数量。
    • kubectl rollout status deployment <deployment-name>:检查部署的状态。
  6. 配置和密钥管理

    • kubectl get configmaps:列出所有的配置映射(ConfigMaps)。
    • kubectl get secrets:列出所有的密钥(Secrets)。
  7. 命名空间管理

    • kubectl get namespaces:列出所有的命名空间。
    • kubectl create namespace <namespace-name>:创建新的命名空间。
    • kubectl delete namespace <namespace-name>:删除指定的命名空间。
  8. 资源监控

    • kubectl top node:显示节点的资源使用情况。
    • kubectl top pod:显示Pod的资源使用情况。
  9. 扩展和编辑资源

    • kubectl autoscale deployment <deployment-name> --min=<min-pod> --max=<max-pod>:自动扩展部署。
    • kubectl edit deployment <deployment-name>:编辑部署的配置。
  10. 网络和端口管理

    • kubectl get networkpolicies:列出所有的网络策略(NetworkPolicies)。
  11. 调试和日志

    • kubectl debug <pod-name>:调试Pod。
  12. 版本和更新

    • kubectl version:显示kubectl工具的版本。
    • kubectl apply -f <filename>:应用配置文件中的更改。