跳到主要内容

第4章 k8s部署

0.k8s工作流程

Kubernetes创建Pod的流程如下:

1. **用户提交请求**:用户通过kubectl或其他客户端工具提交创建Pod的请求,通常以YAML或JSON文件形式定义Pod的配置。
2. **API Server接收请求**:请求发送到Kubernetes API Server,API Server验证请求的合法性和权限。
3. **写入etcd**:API Server将Pod的配置信息写入etcd,确保数据持久化。
4. **调度器选择节点**:调度器(Scheduler)从etcd中获取未调度的Pod,根据资源需求、节点状态等策略选择合适的节点。
5. **绑定节点**:调度器将Pod与选定的节点绑定,并将绑定信息写入etcd。
6. **kubelet创建Pod**:目标节点上的kubelet监控到etcd中的绑定信息,开始创建Pod。kubelet调用容器运行时(如Docker或containerd)拉取镜像并启动容器。
7. **更新状态**:kubelet将Pod的状态更新到API Server,API Server再将状态写入etcd。
8. **Pod运行**:Pod在指定节点上运行,kubelet持续监控其状态,确保其健康运行。

1.k8s的部署方式

k8s的安装方式有很多种,常见的安装方式主要有以下几种:

1.二进制安装 生产推荐

2.kubeadm安装 学习和实验

3.网友写的ansible二进制安装 非常牛叉

4.第三方安装工具比如rancher

5.云服务的k8s 比如阿里云的ACK

这里我们应该把学习使用k8s作为首要任务,所以先选择安装最简单的kubeadm来部署一套k8s集群。

2.kubeadm介绍

kubeadm是google推出的一种部署k8s集群的套件,他将k8s的组件打包封装成了容器,然后通过kubeadm进行集群的初始化。

kubeadm的好处是安装部署方便,缺点是不容易看到每个组件的配置,出了问题不好排查。但是我们现在的重点是学习k8s的使用,所以这些优先选择简单的安装方式,最后会介绍二进制安装部署。

3.集群节点规划

节点规划

主机名	      IP地址

master-01 10.0.0.11

node-01 10.0.0.21

node-02 10.0.0.22

IP规划

POD IP      10.244.0.0/16

Cluster IP 10.96.0.0/12

Node IP 10.0.0.0/24

软件版本规划

k8s 			1.20.15

docker 1.20.15

4.基础环境准备

注意!以下操作所有主机都执行

1)配置host解析

cat >> /etc/hosts << EOF
10.0.0.11 master-01
10.0.0.21 node-01
10.0.0.22 node-02
EOF

2)关闭防火墙

systemctl  stop  firewalld   NetworkManager
systemctl disable firewalld NetworkManager

3)关闭SELinux

setenforce 0
sed -i 's#SELINUX=disabled#SELINUX=disabled#g' /etc/selinux/config
getenforce

4)更新阿里源

wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
sed -i '/aliyuncs/d' /etc/yum.repos.d/*
yum makecache fast

5)确保网络通畅

ping -c 1 www.baidu.com
ping -c 1 master-01
ping -c 1 node-01
ping -c 1 node-02

6)配置时间同步

yum install chrony -y
systemctl start chronyd
systemctl enable chronyd
date

7)关闭SWAP分区

swapoff -a
sed -i '/swap/d' /etc/fstab
free -h

8)升级系统内核


# 从以下网址下载:


# https://mirrors.aliyun.com/elrepo/kernel/el7/x86_64/RPMS/

https://www.cnblogs.com/cheyunhua/p/18294220


# 下载以下2个包,在浏览器下载比较快

kernel-lt-5.4.278-1.el7.elrepo.x86_64.rpm
kernel-lt-devel-5.4.278-1.el7.elrepo.x86_64.rpm


# rpm安装

rpm -ivh kernel-lt-5.4.278-1.el7.elrepo.x86_64.rpm
rpm -ivh kernel-lt-devel-5.4.278-1.el7.elrepo.x86_64.rpm


# 确认已安装内核版本

rpm -qa | grep kernel


# 设置默认引导启动哪个内核

grub2-mkconfig -o /boot/grub2/grub.cfg
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
grub2-set-default 0


# 重启并检查

reboot
uname -r

5.安装配置Docker

注意!以下操作所有主机都执行

1)配置yum源

yum install -y yum-utils device-mapper-persistent-data lvm2
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
yum makecache fast

2)安装指定版本Docker

yum -y install docker-ce-20.10.15 docker-ce-cli-20.10.15

3)配置镜像加速

mkdir /etc/docker -p
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn"
]
}
EOF

#或者下面的源
cat > /etc/docker/daemon.json << 'EOF'
{
"registry-mirrors": [
"https://hub.uuuadc.top",
"https://docker.anyhub.us.kg",
"https://dockerhub.jobcher.com",
"https://docker.ckyl.me",
"https://docker.awsl9527.cn"]
}
EOF

#也可以使用1panel官方的镜像仓库
cat > /etc/docker/daemon.json << 'EOF'
{
"registry-mirrors": [
"https://docker.1panel.live",
"https://proxy.1panel.live",
"https://docker.1panel.top"
]
}
EOF

#重启服务
systemctl daemon-reload
systemctl restart docker

4)设置开机自启动

systemctl enable docker && systemctl start docker

6.kubeadm环境准备

注意!以下操作所有主机都执行

1)设置k8s禁止使用swap

cat > /etc/sysconfig/kubelet<<EOF
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
EOF

2)设置内核参数

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
sysctl --system

3)加载IPVS模块

#老版本内核
cat >/etc/sysconfig/modules/ipvs.modules<<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
chmod +x /etc/sysconfig/modules/ipvs.modules
source /etc/sysconfig/modules/ipvs.modules
lsmod | grep -e ip_vs -e nf_conntrack_ipv

#新版本内核
cat >/etc/sysconfig/modules/ipvs.modules<<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
modprobe br_netfilter
EOF
chmod +x /etc/sysconfig/modules/ipvs.modules
source /etc/sysconfig/modules/ipvs.modules
lsmod | grep -e ip_vs -e nf_conntrack_ipv

7.kubeadm安装部署

注意!以下操作所有主机都执行

1)设置kubeadm国内仓库

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)安装指定版本kubeadm

yum install -y kubelet-1.20.15 kubeadm-1.20.15 kubectl-1.20.15 ipvsadm --nogpgcheck

3)设置kubelet开机启动

systemctl enable kubelet

4)设置kubectl支持命令补全

yum install bash-completion -y
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
kubectl completion bash > /etc/bash_completion.d/kubectl

8.kubeadm集群初始化-只在master节点运行

1)集群初始化

kubeadm init \
--apiserver-advertise-address=10.0.0.11 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.20.15 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--service-dns-domain=cluster.local \
--ignore-preflight-errors=Swap \
--ignore-preflight-errors=NumCPU

参数解释:

--apiserver-advertise-address=10.0.0.11  	#API Server的地址
--image-repository registry.aliyuncs.com/google_containers #镜像仓库地址,这里使用的是阿里云
--kubernetes-version v1.20.15 #安装的k8s版本
--service-cidr=10.96.0.0/12 #Cluster IP
--pod-network-cidr=10.244.0.0/16 #Pod IP
--service-dns-domain=cluster.local #全域名的后缀,默认是cluster.local
--ignore-preflight-errors=Swap #忽略SWAP检查不通过的警告
--ignore-preflight-errors=NumCPU #忽略CPU检查不通过的警告

2)准备配置文件

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

3)获取Node节点信息

kubectl get nodes

4)设置kube-proxy使用ipvs模式

执行编辑命令,然后将mode: ""修改为mode: "ipvs"然后保存退出,这里涉及到configmap资源类型,后面详细讲解。

kubectl edit cm kube-proxy -n kube-system
#需要修改mode为ipvs模式
kubectl -n kube-system get pod|grep kube-proxy|awk '{print "kubectl -n kube-system delete pod "$1}'|bash
ipvsadm -Ln

5)部署Flannel网络插件-只在master节点上安装部署

克隆代码

[root@master-01 ~/k8s]# git clone --depth 1 https://github.com/coreos/flannel.git
[root@master-01 ~/k8s]# cd flannel/Documentation/
[root@master-01 ~/k8s/flannel/Documentation]#

下载下来后还需要修改资源配置清单

[root@master-01 ~/k8s/flannel/Documentation]# vim kube-flannel.yml
...
165 containers:
166 - name: kube-flannel
167 image: docker.io/flannel/flannel:v0.24.2
168 command:
169 - /opt/bin/flanneld
170 args:
171 - --ip-masq
172 - --kube-subnet-mgr
173 - --iface=eth0 #如果是多网卡,需要指定网卡名称

应用资源配置清单

 kubectl create -f kube-flannel.yml

检查pod运行状态等一会应该是running

[root@master-01 ~]# kubectl -n kube-flannel get pod
NAME READY STATUS RESTARTS AGE
kube-flannel-ds-fv2tr 1/1 Running 0 8m38s

9.kubeadm node节点配置-只在Node节点执行

1)node节点加入集群

刚才在master集群初始化的时候会生成一串命令,这个命令就是给node节点加入集群的指令。

kubeadm join 10.0.0.11:6443 --token qba2oa.7fxlo1qpl9emkvde \
--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

如果当时没有保存,可以执行以下命令重新查看:

kubeadm token create --print-join-command

2)master节点查看节点信息

kubectl get nodes

3)master节点执行打标签命令

kubectl label nodes node-21 node-role.kubernetes.io/node=
kubectl label nodes node-22 node-role.kubernetes.io/node=

4)检查状态

[root@master-01 /mnt]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master-01 Ready control-plane,master 162m v1.20.15
node-01 Ready node 148m v1.20.15
node-02 Ready node 147m v1.20.15

更新: 2025-03-03 15:40:20