前言
实验拓扑:
实验要求:
(1)Kubernetes 区域可采用 Kubeadm 方式进行安装。
(2)要求在 Kubernetes 环境中,通过yaml文件的方式,创建2个Nginx Pod分别放置在两个不同的节点上,Pod使用hostPath类型的存储卷挂载,节点本地目录共享使用 /data,2个Pod副本测试页面二者要不同,以做区分,测试页面可自己定义。
(3)编写service对应的yaml文件,使用NodePort类型和TCP 30000端口将Nginx服务发布出去。
(4)负载均衡区域配置Keepalived+Nginx,实现负载均衡高可用,通过VIP 192.168.10.100和自定义的端口号即可访问K8S发布出来的服务。
(5)iptables防火墙服务器,设置双网卡,并且配置SNAT和DNAT转换实现外网客户端可以通过12.0.0.1访问内网的Web服务。
实验环境:
节点 | IP | 安装组件 |
master(2C/4G,cpu核心数要求大于2) | 192.168.10.10 | docker、kubeadm、kubelet、kubectl、flannel |
node01(2C/2G) | 192.168.10.20 | docker、kubeadm、kubelet、kubectl、flannel |
node02(2C/2G) | 192.168.10.30 | docker、kubeadm、kubelet、kubectl、flannel |
lb01 | 192.168.10.40 | nginx,keepalived |
lb02 | 192.168.10.50 | nginx,keepalived |
网关服务器 | 内网网卡ens33:192.168.10.1,外网网卡ens32:12.0.0.1 | iptables |
客户端 | 12.0.0.1 |
一、Kubeadm 方式部署 k8s 集群
1.1 环境准备(所有节点操作)
#所有节点,关闭防火墙规则,关闭selinux,关闭swap交换 systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i 's/enforcing/disabled/' /etc/selinux/config iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X swapoff -a #交换分区必须要关闭 sed -ri 's/.*swap.*/#&/' /etc/fstab #永久关闭swap分区,&符号在sed命令中代表上次匹配的结果 #加载 ip_vs 模块 for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done #修改主机名 hostnamectl set-hostname master #master节点操作 su hostnamectl set-hostname node01 #node01节点操作 su hostnamectl set-hostname node02 #node02节点操作 su #所有节点修改/etc/hosts文件,添加IP和主机名的映射关系 vim /etc/hosts 192.168.10.10 master 192.168.10.20 node01 192.168.10.30 node02 #调整内核参数 cat > /etc/sysctl.d/kubernetes.conf << EOF #开启网桥模式,可将网桥的流量传递给iptables链 net.bridge.bridge-nf-call-ip6tables=1 net.bridge.bridge-nf-call-iptables=1 #关闭ipv6协议 net.ipv6.conf.all.disable_ipv6=1 net.ipv4.ip_forward=1 EOF #生效参数 sysctl --system
1.2 所有节点安装docker
#安装环境依赖包 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 #安装 docker-ce yum install -y docker-ce #docker-ce-cli、containerd.io 会作为依赖包被安装 mkdir /etc/docker cat > /etc/docker/daemon.json <<EOF { "registry-mirrors": ["https://3u6mkfxb.mirror.aliyuncs.com"], #使用镜像加速 "exec-opts": ["native.cgroupdriver=systemd"], #将Cgroup引擎修改为systemd "log-driver": "json-file", "log-opts": { "max-size": "100m" } } EOF #使用Systemd管理的Cgroup来进行资源控制与管理,因为相对Cgroupfs而言,Systemd限制CPU、内存等资源更加简单和成熟稳定。 #日志使用json-file格式类型存储,大小为100M,保存在/var/log/containers目录下,方便ELK等日志系统收集和管理日志。 #重新加载配置,将docker设置为开机自启 systemctl daemon-reload systemctl restart docker.service systemctl enable docker.service #查看Cgroup引擎是否已变更 docker info | grep "Cgroup Driver" Cgroup Driver: systemd
1.3 所有节点安装kubeadm,kubelet和kubectl
#定义kubernetes安装源 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=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 EOF #安装kubeadm,kubelet和kubectl yum install -y kubelet-1.20.11 kubeadm-1.20.11 kubectl-1.20.11 #设置开机自启kubelet systemctl enable kubelet.service #K8S通过kubeadm安装出来以后都是以Pod方式存在,即底层是以容器方式运行,所以kubelet必须设置开机自启。
1.4 部署K8S集群
#----- 1、查看初始化需要的镜像 ---- kubeadm config images list #查看可知,共需要7个镜像 I0725 16:13:20.194926 13583 version.go:254] remote version is much newer: v1.24.3; falling back to: stable-1.20 k8s.gcr.io/kube-apiserver:v1.20.15 k8s.gcr.io/kube-controller-manager:v1.20.15 k8s.gcr.io/kube-scheduler:v1.20.15 k8s.gcr.io/kube-proxy:v1.20.15 k8s.gcr.io/pause:3.2 k8s.gcr.io/etcd:3.4.13-0 k8s.gcr.io/coredns:1.7.0 #----- 2、在 master 节点上传 v1.20.11.zip 压缩包(压缩包中包含所需的镜像文件)至 /opt 目录 ------ cd /opt/ mkdir /opt/k8s unzip v1.20.11.zip -d /opt/k8s #解压 cd /opt/k8s/v1.20.11 for i in $(ls *.tar); do docker load -i $i; done #载入镜像,将镜像文件导入到镜像库中 docker images #查看本地镜像 #----- 3、复制镜像和脚本到 node 节点,并在 node 节点上执行脚本加载镜像文件 ----- scp -r /opt/k8s root@node01:/opt scp -r /opt/k8s root@node02:/opt cd /opt/k8s/v1.20.11 for i in $(ls *.tar); do docker load -i $i; done #----- 4、初始化kubeadm ------------------ #master节点,通过如下指令创建默认的kubeadm-config.yaml文件 kubeadm config print init-defaults > /opt/kubeadm-config.yaml #修改文件 cd /opt/ vim kubeadm-config.yaml ...... 11 localAPIEndpoint: 12 advertiseAddress: 192.168.10.10 #指定master节点的IP地址 13 bindPort: 6443 ...... 34 kubernetesVersion: v1.20.11 #指定kubernetes版本号 35 networking: 36 dnsDomain: cluster.local 38 serviceSubnet: 10.96.0.0/16 #指定service网段 37 podSubnet: "10.244.0.0/16" #指定pod网段,10.244.0.0/16用于匹配flannel默认网段 39 scheduler: {} #末尾再添加以下内容 --- apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration mode: ipvs #把默认的kube-proxy调度方式改为ipvs模式 #在master节点操作,初始化kubeadm,搭建k8s控制平面节点。结尾会有几条命令分别在master和node上执行 kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.log #--experimental-upload-certs 参数可以在后续执行加入节点时自动分发证书文件,K8S V1.16版本开始替换为 --upload-certs #tee kubeadm-init.log 用以输出日志 #master节点执行以下命令: #kubectl需经由API server认证及授权后方能执行相应的管理操作,kubeadm 部署的集群为其生成了一个具有管理员权限的认证配置文件 /etc/kubernetes/admin.conf,它可由 kubectl 通过默认的 “$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 #两个node节点执行以下命令,加入集群: kubeadm join 192.168.10.10:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:b48d7bec33150c0f58bd04c17a6b994900fdef116b6ef355282909330b3a23cc #查看 kubeadm-init 日志 less kubeadm-init.log #kubernetes配置文件目录 ls /etc/kubernetes/ #存放ca等证书和密码的目录 ls /etc/kubernetes/pki #--------- 5、master节点,修改yaml文件,进行健康检查 ------------------------ #初始化后,kubeadm本身没有健康检查方法,需要修改两个yaml文件,之后重启kubelet。 kubectl get cs #查看集群健康状态,有2个组件不健康,需要修改对应组件的yaml文件 #如果 kubectl get cs 发现集群不健康,更改以下两个yaml文件 vim /etc/kubernetes/manifests/kube-scheduler.yaml ...... 16 - --bind-address=192.168.10.10 #修改成k8s的控制节点master的ip ...... 19 #- --port=0 # 搜索port=0,把这一行注释掉 ...... 24 httpGet: 25 host: 192.168.10.10 #修改成k8s的控制节点master的ip ...... 38 httpGet: 39 host: 192.168.10.10 #修改成k8s的控制节点master的ip vim /etc/kubernetes/manifests/kube-controller-manager.yaml 17 - --bind-address=192.168.10.10 #修改成k8s的控制节点master的ip ...... 26 #- --port=0 # 搜索port=0,把这一行注释掉 ...... 36 httpGet: 37 host: 192.168.10.10 #修改成k8s的控制节点master的ip ...... 50 httpGet: 51 host: 192.168.10.10 #修改成k8s的控制节点master的ip #重启kubelet systemctl restart kubelet #查看集群健康状态 kubectl get cs
1.5 所有节点部署网络插件flannel
#在master节点查看所有节点状态,由于网络插件还没有部署,节点没有准备就绪,所以显示NotReady kubectl get nodes NAME STATUS ROLES AGE VERSION master NotReady control-plane,master 8m52s v1.20.11 node01 NotReady <none> 7m9s v1.20.11 node02 NotReady <none> 7m5s v1.20.11 #---所有节点部署网络插件flannel ##(1)方法一: #所有节点上传flannel镜像 flannel.tar 到 /opt 目录,master节点上传 kube-flannel.yml 文件。 #kube-flannel.yml 文件的下载地址https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml cd /opt docker load -i flannel.tar #所有节点导入镜像 #在 master 节点创建 flannel 资源 kubectl apply -f kube-flannel.yml --------------------------------------------------------------------------------------------- ##(2)方法二: kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml #在 node 节点上执行 kubeadm join 命令加入群集 kubeadm join 192.168.80.10:6443 --token rc0kfs.a1sfe3gl4dvopck5 \ --discovery-token-ca-cert-hash sha256:864fe553c812df2af262b406b707db68b0fd450dc08b34efb73dd5a4771d37a2 ------------------------------------------------------------------------------------------------- #现在在master节点查看节点状态,都已是Ready状态 kubectl get nodes NAME STATUS ROLES AGE VERSION master Ready control-plane,master 136m v1.20.11 node01 Ready <none> 98m v1.20.11 node02 Ready <none> 92m v1.20.11 #查看各组件,都是Running状态 kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE coredns-74ff55c5b-788pc 1/1 Running 0 137m coredns-74ff55c5b-9hfnv 1/1 Running 0 137m etcd-master 1/1 Running 0 137m kube-apiserver-master 1/1 Running 0 137m kube-controller-manager-master 1/1 Running 0 45m kube-flannel-ds-8ck6r 1/1 Running 0 3m10s kube-flannel-ds-9svrq 1/1 Running 0 3m10s kube-flannel-ds-fxpwt 1/1 Running 0 3m10s kube-proxy-22mgq 1/1 Running 0 137m kube-proxy-2lx25 1/1 Running 0 93m kube-proxy-s5s75 1/1 Running 0 99m kube-scheduler-master 1/1 Running 0 62m