kubeadm部署k8s-1.28
总览
本文将介绍如何通过kubeadm工具,部署k8s集群,操作步骤如下
-
准备工作:
-
- 配置yum源,repo(防被墙)
- 安装常用工具,同步时间
- 关闭防火墙,将SELinux配置为Permissive模式,关闭swap
- 加载ipvs模块,优化内核
-
在所有机器上安装docker
-
在所有机器上安装kubeadm, kubelet, kubectl
-
部署集群Master节点
-
安装CNI网络插件
-
部署集群工作节点
| 主机 | IP | 备注 |
|---|---|---|
| master | 192.168.124.10 | k8s主节点 |
| node1 | 192.168.124.11 | k8s工作节点1 |
| node2 | 192.168.124.12 | k8s工作节点2 |
0、系统要求
安装之前,请确保操作系统满足如下要求:
- Linux内核操作系统,如CentOS,Ubuntu等
- 至少2 CPU, 2GB
- 集群中所有机器之间的网络必须是通的(公共或私有网络都可以)。
- 每个节点都有唯一的主机名、MAC地址和product_uuid
- 部署时要保证能连外网
- 用root用户部署
## 查看操作系统
cat /proc/version
hostnamectl
## 查看IP和MAC命令
ip link
ifconfig -a
## 查看product_uuid
cat /sys/class/dmi/id/product_uuid
1、准备工作-所有节点都要做
1.1、配置yum源,repo
# yum源
curl -o /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# docker repo
curl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# kubernetes repo
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# 缓存
yum clean all && yum makecache
1.2、安装常用工具,同步时间
yum -y install tree vim wget bash-completion bash-completion-extras lrzsz net-tools sysstat iotop iftop htop unzip nc nmap telnet bc psmisc httpd-tools ntpdate
# 时区修改,如果/etc/localtime有软连接,不是Shanghai,可以直接删除,在软链接
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ntpdate ntp2.aliyun.com # 同步阿里云服务器上的时间.
/sbin/hwclock --systohc # 写入到bios系统
1.3、检查防火墙是否关闭,关闭selinux,关闭swap分区
## 查看防火墙状态
firewall-cmd --state
## 如果防火墙是running,关闭防火墙
systemctl disable firewalld && systemctl stop firewalld
## 直接关闭SELinux
setenforce 0
sed -ri 's#(SELINUX=).*#\1disabled#' /etc/selinux/config
# 临时关闭swap。如果不关闭,kubelet会启动失败
swapoff -a
# 永久防止开机自动挂载swap
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
1.4、加载ipvs模块,优化内核
# 加载ipvs模块
modprobe br_netfilter
modprobe -- ip_vs
modprobe -- ip_vs_sh
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- nf_conntrack_ipv4
# 验证ip_vs模块
lsmod |grep ip_vs
ip_vs_wrr 12697 0
ip_vs_rr 12600 0
ip_vs_sh 12688 0
ip_vs 145458 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack 139264 2 ip_vs,nf_conntrack_ipv4
libcrc32c 12644 3 xfs,ip_vs,nf_conntrack
# 内核文件
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1
vm.max_map_count=262144
EOF
# 生效并验证内核优化
sysctl -p /etc/sysctl.d/k8s.conf
2、安装docker-所有节点运行
2.1 安装启动docker
yum install docker-ce-19.0.0 docker-ce-cli-19.2.0 containerd.io -y
## 1. yum 安装
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
## 2. 配置docker
cat <<EOF > /etc/docker/daemon.json
{
"registry-mirrors": [
"https://registry.hub.docker.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com"
]
}
EOF
## 3. 启动docker
systemctl start docker
## 4、验证是否成功启动
systemctl status docker
## 5、启动容器测试
docker run hello-world
2.2、配置containerd中pause镜像地址
为了防止安装过程中出现pause镜像下载失败的问题,建议运行containerd config dump > /etc/containerd/config.toml 命令,将当前配置导出到文件,并修改sandbox_image配置。
## 如果没有/etc/containerd/config.toml文件,将默认配置导出到/etc/containerd/config.toml。
containerd config default > /etc/containerd/config.toml
## 修改配置文件/etc/containerd/config.toml, 更改sandbox_image配置
[plugins]
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
## PS: 如果生成的/etc/containerd/config.toml中没有如上配置项,可以运行如下命令导出当前所有配置项后再修改文件/etc/containerd/config.toml
# containerd config dump > /etc/containerd/config.toml
## 重启containerd
systemctl restart containerd
3、部署kubeadm,kubelet,kubectl
kubeadm:启动k8s集群的工具
kubelet: 该组件在集群中的所有机器上运行,并执行启动pod和容器之类的任务。
kubectl: 与集群通信的工具。可以只在master节点上安装
# yum安装
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
#指定安装版本
yum install -y kubelet-1.19.0 kubeadm-1.19.0 kubectl-1.19.0 --disableexcludes=kubernetes
## 开机启动kubelet
systemctl enable --now kubelet
## 验证
kubeadm version
4、初始化Master节点-Master节点运行
4.1、更改配置文件
kubeadm init命令用于初始化master节点。kubeadm init 的参数可以通过命令行或yaml文件进行配置。本文介绍如何通过yaml文件进行配置。可以通过kubeadm config print init-defaults命令得到一份默认配置,然后对其进行修改。
kubeadm config print init-defaults > kubeadm.yaml
对kubeadm.yaml进行编辑,修改内容如下:
- 修改
advertiseAddress为master IP地址 imageRepository修改为registry.aliyuncs.com/google_containers,防止镜像拉不下来- 建议将
networking.podSubnet修改为10.244.0.0/16, 和后续安装的flannel CNI 插件的默认配置保持一致
piVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.124.10 ## change the IP of apiserver.
bindPort: 6443
nodeRegistration:
criSocket: unix:///var/run/containerd/containerd.sock
imagePullPolicy: IfNotPresent
name: node
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 ## change imageRepository to aliyun.
kind: ClusterConfiguration
kubernetesVersion: 1.28.0
networking:
dnsDomain: cluster.local
podSubnet: 10.244.0.0/16 ## add this line to config POD network. Same with CNI config.
serviceSubnet: 10.96.0.0/12
scheduler: {}
如上配置文件等价于命令行:
kubeadm init \
--apiserver-advertise-address=192.168.124.10 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.28.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
- –apiserver-advertise-address 集群通告地址
- –image-repository 由于默认拉取镜像地址http://k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
- –kubernetes-version K8s版本,与上面安装的一致
- –service-cidr 集群内部虚拟网络,Pod统一访问入口
- –pod-network-cidr Pod网络,与下面部署的CNI网络组件yaml中保持一致
4.2 提前pull镜像
## 验证配置文件格式是否正确
kubeadm config validate --config kubeadm.yaml
## 查看需要下载哪些镜像。需要关注下载的repository地址是否正确。
## 如上在kubeadm.yaml文件配置了imageRepository:registry.aliyuncs.com/google_containers,因此images会从aliyun的repo下载。
# 查看
[root@master ~]# kubeadm config images list --config kubeadm.yaml
registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.0
registry.aliyuncs.com/google_containers/kube-controller-manager:v1.28.0
registry.aliyuncs.com/google_containers/kube-scheduler:v1.28.0
registry.aliyuncs.com/google_containers/kube-proxy:v1.28.0
registry.aliyuncs.com/google_containers/pause:3.9
registry.aliyuncs.com/google_containers/etcd:3.5.9-0
registry.aliyuncs.com/google_containers/coredns:v1.10.1
## 拉取镜像
kubeadm config images pull --config kubeadm.yaml
4.3 kubeadm init初始化
运行kubeadm init --config kubeadm.yaml, 当看到Your Kubernetes control-plane has initialized successfully!时表示安装成功。
[root@master ~]# kubeadm init --config 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 192.168.246.133:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:9f7d37c768e658119242dfb49675eaeb3cbdbb7d191526bfa197dd92373b40ab
PS:最好将最后一行log需要记下来,worker节点安装会用到。
根据提示,退出root账户后运行命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
4.4、验证
## kubectl 运行正常. STATUS=NotReady是因为CNI插件还没装。
[shirley@master k8s_install]$ kubectl get node
NAME STATUS ROLES AGE VERSION
node NotReady control-plane 20m v1.28.2
## 通过crictl命令可以查看到运行的container
[shirley@master k8s_install]$ sudo crictl ps -a
5、安装CNI网络插件
Kubernetes 它需要网络插件来提供集群内部和集群外部的网络通信。以下是一些常用的 k8s 网络插件:
- Flannel:Flannel 是最常用的 k8s 网络插件之一,它使用了虚拟网络技术来实现容器之间的通信,支持多种网络后端,如 VXLAN、UDP 和 Host-GW。
- Calico:Calico 是一种基于 BGP 的网络插件,它使用路由表来路由容器之间的流量,支持多种网络拓扑结构,并提供了安全性和网络策略功能。
- Canal:Canal 是一个组合了 Flannel 和 Calico 的网络插件,它使用 Flannel 来提供容器之间的通信,同时使用 Calico 来提供网络策略和安全性功能。
- Weave Net:Weave Net 是一种轻量级的网络插件,它使用虚拟网络技术来为容器提供 IP 地址,并支持多种网络后端,如 VXLAN、UDP 和 TCP/IP,同时还提供了网络策略和安全性功能。
- Cilium:Cilium 是一种基于 eBPF (Extended Berkeley Packet Filter) 技术的网络插件,它使用 Linux 内核的动态插件来提供网络功能,如路由、负载均衡、安全性和网络策略等。
- Contiv:Contiv 是一种基于 SDN 技术的网络插件,它提供了多种网络功能,如虚拟网络、网络隔离、负载均衡和安全策略等。
- Antrea:Antrea 是一种基于 OVS (Open vSwitch) 技术的网络插件,它提供了容器之间的通信、网络策略和安全性等功能,还支持多种网络拓扑结构
5.1、安装flanne网络插件
1、下载kube-flannel.yml
## 1. 下载kube-flannel.yml
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kube-flannel.yaml文件中,需要注意,net-conf.json里的network要和kubeadm.yaml里配置的networking.podSubnet相同
... ...
net-conf.json: |
{
### 这里的network和kubeadm.yaml里配置的networking.podSubnet相同
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
... ...
2、容器部署flannel
[root@master ~]# kubectl apply -f kube-flannel.yml
namespace/kube-flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
6、初始化工作节点
6.1、运行kubeadm join将工作节点加入集群
如果master节点安装时,没有记录下token,或token超时(默认24小时),可以运行如下命令重新生成
#kubeadm token create --print-join-command
kubeadm join 192.168.124.10:6443 --token by8q23.65btteq9iud7ypso --discovery-token-ca-cert-hash sha256:9f7d37c768e658119242dfb49675eaeb3cbdbb7d191526bfa197dd92373b40ab
将上述命令粘贴到工作节点,将工作节点添加到集群
[root@node1 ~]# kubeadm join 192.168.124.10:6443 --token by8q23.65btteq9iud7ypso --discovery-token-ca-cert-hash
6.2 验证
到master节点运行kubelet get node,可以看到加进来的node
kubectl get nodes
8、验证集群
如下通过创建一个deployment验证集群运行是否正常
## 创建deployment
[root@master ~]# kubectl create deployment nginx --image=nginx
deployment.apps/nginx created
## expose端口到宿主机
[root@master ~]# kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposed
## -o wide参数可以看到nginx调度到哪个node上
[root@master ~]# kubectl get all -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/nginx-7854ff8877-h9njh 1/1 Running 0 84s 10.244.3.2 node1 <none> <none>
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 135m <none>
###### 这里可以看到 nginx端口映射到宿主机的30907上
service/nginx NodePort 10.101.192.239 <none> 80:31769/TCP 46s app=nginx
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
deployment.apps/nginx 1/1 1 1 84s nginx nginx app=nginx
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
replicaset.apps/nginx-7854ff8877 1 1 1 84s nginx nginx app=nginx,pod-template-hash=7854ff8877
由kubectl get all -o wide获取的信息可以看出,pod调度到了node1(本例中,node1的ip为192.168.124.11)节点,service将80端口映射到了宿主机上的31769端口上。因此,可以通过http://192.168.124.11:31769/`访问到nginx页面

浙公网安备 33010602011771号