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 | 主机名规划 |
|---|---|---|
| 1 | 10.0.0.12 | k8s-master |
| 2 | 10.0.0.15 | k8s-node1 |
| 3 | 10.0.0.16 | k8s-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、常用命令
-
集群管理:
kubectl cluster-info:显示集群的相关信息。
-
节点管理:
kubectl get nodes:列出集群中的所有节点。kubectl describe node <node-name>:显示指定节点的详细信息。kubectl drain <node-name>:准备节点进行维护,排除调度。kubectl cordon <node-name>:标记节点不可调度。
-
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。
-
服务(Service)和负载均衡(LoadBalancer) :
kubectl get services:列出所有的服务。kubectl describe service <service-name>:显示指定服务的详细信息。kubectl expose pod <pod-name> -port=<port>:将Pod暴露为服务。
-
部署(Deployment)管理:
kubectl get deployments:列出所有的部署。kubectl describe deployment <deployment-name>:显示指定部署的详细信息。kubectl scale deployment <deployment-name> --replicas=<num-replicas>:设置部署的副本数量。kubectl rollout status deployment <deployment-name>:检查部署的状态。
-
配置和密钥管理:
kubectl get configmaps:列出所有的配置映射(ConfigMaps)。kubectl get secrets:列出所有的密钥(Secrets)。
-
命名空间管理:
kubectl get namespaces:列出所有的命名空间。kubectl create namespace <namespace-name>:创建新的命名空间。kubectl delete namespace <namespace-name>:删除指定的命名空间。
-
资源监控:
kubectl top node:显示节点的资源使用情况。kubectl top pod:显示Pod的资源使用情况。
-
扩展和编辑资源:
kubectl autoscale deployment <deployment-name> --min=<min-pod> --max=<max-pod>:自动扩展部署。kubectl edit deployment <deployment-name>:编辑部署的配置。
-
网络和端口管理:
kubectl get networkpolicies:列出所有的网络策略(NetworkPolicies)。
-
调试和日志:
kubectl debug <pod-name>:调试Pod。
-
版本和更新:
kubectl version:显示kubectl工具的版本。kubectl apply -f <filename>:应用配置文件中的更改。