第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