podSubnet(pod 网段):10.244.0.0/16

serviceSubnet(service 网段): 10.10.0.0/16

服务器ip(主机网段):10.30.0.0/16

注意:pod、service、主机ip不能在同一网段

实验环境规划:

操作系统:centos7.8

配置:4Gib 内存/2vCPU/100G 硬盘

01、实验环境准备

配置机器主机名

#在主节点上执行 

[root@test-0020 ~]# hostnamectl  set-hostname  k8s-master && bash

#在工作节点node1上执行 

[root@test-0021 ~]# hostnamectl  set-hostname  k8s-node1 && bash

#在工作节点node2上执行 

[root@test-0022 ~]# hostnamectl  set-hostname  k8s-node2 && bash

配置主机 hosts 文件,相互之间通过主机名互相访问

三台节点都需要添加

[root@k8s-master ~]# vim /etc/hosts

10.30.11.180 k8s-master 

10.30.11.181 k8s-node1

10.30.11.182 k8s-node2

配置主机之间无密码登录

#三台节点都需要做

[root@k8s-master ~]# ssh-keygen   #一路回车,不输入密码

#把本地生成的密钥文件和私钥文件拷贝到远程主机

[root@k8s-master ~]# ssh-copy-id -i k8s-master

[root@k8s-master ~]# ssh-copy-id -i k8s-node1

[root@k8s-master ~]# ssh-copy-id -i k8s-node2

关闭交换分区 swap,提升性能

#临时关闭,三台节点都需要做

[root@k8s-master ~]# swapoff  -a



#永久关闭:注释 swap 挂载,给 swap 这行开头加一下注释

[root@k8s-master ~]# vim /etc/fstab

#/dev/mapper/centos-swap swap swap defaults 0 0

修改机器内核参数

三台节点都需要做

[root@k8s-master ~]# modprobe br_netfilter

[root@k8s-master ~]# echo "modprobe br_netfilter" >> /etc/profile

[root@k8s-master ~]# vim  /etc/sysctl.d/k8s.conf 

net.bridge.bridge-nf-call-ip6tables = 1 

net.bridge.bridge-nf-call-iptables = 1 

net.ipv4.ip_forward = 1 

[root@k8s-master ~]# sysctl -p /etc/sysctl.d/k8s.conf

关闭 firewalld 防火墙和selinux

三台节点都需要做

[root@k8s-master ~]# systemctl stop firewalld && systemctl disable firewalld



#修改 selinux 配置文件之后,重启机器,selinux 配置才能永久生效

[root@k8s-master ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

配置阿里云的 repo 源

三台节点都需要配置

#安装 wget 命令

[root@k8s-master ~]# yum -y install wget

#备份基础 repo 源

[root@k8s-master ~]# mkdir /root/repo.bak

[root@k8s-master ~]# mv /etc/yum.repos.d/* /root/repo.bak

#下载阿里云的 repo 源

[root@k8s-master ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

[root@k8s-master ~]# wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo

#配置国内阿里云 docker 的 repo 源

[root@k8s-master ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

#配置安装 k8s 组件需要的阿里云的 repo 源

[root@k8s-master ~]# vim /etc/yum.repos.d/kubernetes.repo

[kubernetes] 

name=Kubernetes 

baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ 

enabled=1 

gpgcheck=0

#运行 yum makecache 生成缓存

[root@k8s-master ~]# yum makecache

配置时间同步

三台节点都需要配置

#安装 ntpdate 命令

[root@k8s-master ~]# yum install ntpdate -y

#跟网络时间做同步

[root@k8s-master ~]# ntpdate cn.pool.ntp.org

#把时间同步做成计划任务

[root@k8s-master ~]# crontab -e

 * */1 * * * /usr/sbin/ntpdate cn.pool.ntp.org

 #重启 crond 服务

 [root@k8s-master ~]# systemctl  restart  crond.service

开启ipvs

三台节点都需要配置

[root@k8s-master ~]# vim  /etc/sysconfig/modules/ipvs.modules

#!/bin/bash

ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack"

for kernel_module in ${ipvs_modules}; do

 /sbin/modinfo -F filename ${kernel_module} > /dev/null 2>&1

 if [ 0 -eq 0 ]; then

 /sbin/modprobe ${kernel_module}

 fi

done

[root@k8s-master ~]#  chmod 755 /etc/sysconfig/modules/ipvs.modules  &&  bash /etc/sysconfig/modules/ipvs.modules  &&  lsmod | grep ip_vs

安装基础软件包

三台节点都需要安装

[root@k8s-master ~]#  yum install -y yum-utils device-mapper-persistent-data lvm2  net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl  curl-devel unzip sudo ntp libaio-devel  vim ncurses-devel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack ntpdate telnet ipvsadm

02、安装 docker 服务

安装 docker-ce

三台节点都需要安装

[root@k8s-master ~]#  yum install docker-ce-20.10.6 docker-ce-cli-20.10.6  containerd.io -y

[root@k8s-master ~]#  systemctl start docker && systemctl enable docker.service  && systemctl status  docker.service

配置 docker 镜像加速器和驱动

三台节点都需要配置

[root@k8s-master ~]#  vim /etc/docker/daemon.json

{ 

 "registry-mirrors":["https://rsbud4vc.mirror.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com","http://qtid6917.mirror.aliyuncs.com", "https://rncxm540.mirror.aliyuncs.com"], "exec-opts": ["native.cgroupdriver=systemd"] 

}

#修改 docker 文件驱动为 systemd,默认为 cgroupfs,kubelet 默认使用 systemd,两者必须一致才可以。

[root@k8s-master ~]#  systemctl daemon-reload && systemctl restart docker &&  systemctl status docker

03、安装 软件包

安装初始化 k8s 需要的软件包

三台节点都需要安装

[root@k8s-master ~]# yum install -y kubelet-1.20.6 kubeadm-1.20.6 kubectl-1.20.6 

[root@k8s-master ~]# systemctl enable kubelet  &&   systemctl status kubelet

kubeadm搭建测试环境k8s集群_软件测试

#上面可以看到 kubelet 状态不是 running 状态,这个是正常的,不用管,等 k8s 组件起来这个 kubelet 就正常了。

注:每个软件包的作用

  • Kubeadm: kubeadm 是一个工具,用来初始化 k8s 集群的
  • kubelet: 安装在集群所有节点上,用于启动 Pod 的
  • kubectl: 通过 kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件

04、初始化 k8s 集群

kubeadm 初始化 k8s 集群

#把初始化 k8s 集群需要的离线镜像包上传到 三台机器上,手动解压(没有包的,可以忽略不做)
[root@k8s-master ~]# docker load -i k8simage-1-20-6.tar.gz

#使用 kubeadm 初始化 k8s 集群

[root@k8s-master ~]#  kubeadm init --kubernetes-version=1.20.6 --apiserver-advertise-address=10.30.11.180 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=SystemVerification

注:–image-repository registry.aliyuncs.com/google_containers:手动指定仓库地址为

registry.aliyuncs.com/google_containers。kubeadm 默认从 k8s.grc.io 拉取镜像,但是k8s.gcr.io 访问不到,所以需要指定从registry.aliyuncs.com/google_containers仓库拉取镜像。

显示如下,说明安装完成:

kubeadm搭建测试环境k8s集群_程序员_02

kubeadm join 10.30.11.180:6443 --token pyfcsa.h2bbcgr67d1xt5hg

- -discovery-token-ca-cert-hash sha256:6ebd3797f8550e089968b23f2ca5b457c67c77768fe86e8b1ca0eddd3017cba6

#上面命令是把 node 节点加入集群,需要保存下来,每个人的都不一样

#配置 kubectl 的配置文件 config,相当于对 kubectl 进行授权,这样 kubectl 命令可以使用这个证书对 k8s 集群进行管理

[root@k8s-master ~]# mkdir -p $HOME/.kube

[root@k8s-master ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

[root@k8s-master ~]# chown $ (id -u):$(id -g) $HOME/.kube/config

[root@k8s-master ~]# kubectl  get nodes

 

kubeadm搭建测试环境k8s集群_程序员_03

#此时集群状态还是 NotReady 状态,因为没有安装网络插件。

05、扩容 k8s 集群

扩容 k8s 集群-添加两个工作节点

在 k8s-master上查看加入节点的命令

[root@k8s-master ~]# kubeadm token create --print-join-command

 

kubeadm搭建测试环境k8s集群_接口测试_04

把 k8s-node1和 k8s-node2 加入 k8s 集群:

在k8s-node1上执行命令

[root@k8s-node1 ~]# kubeadm join 10.30.11.180:6443 --token iel0ae.sno2znw28v5kup2k     --discovery-token-ca-cert-hash sha256:6ebd3797f8550e089968b23f2ca5b457c67c77768fe86e8b1ca0eddd3017cba6



在k8s-node2上执行命令

[root@k8s-node2 ~]# kubeadm join 10.30.11.180:6443 --token iel0ae.sno2znw28v5kup2k     --discovery-token-ca-cert-hash sha256:6ebd3797f8550e089968b23f2ca5b457c67c77768fe86e8b1ca0eddd3017cba6
k8s-master上查看集群节点状况

[root@k8s-master ~]# kubectl  get nodes

kubeadm搭建测试环境k8s集群_自动化测试_05

注意:上面状态都是 NotReady 状态,说明没有安装网络插件

可以看到 k8s-node1、k8s-node2 的 ROLES 角色为空,<none>就表示这个节点是工作节点。

可以把 k8s-node1 和 k8s-node2 的 ROLES 变成 work,按照如下方法:

[root@k8s-master ~]#  kubectl label node k8s-node1 node-role.kubernetes.io/worker=worker



[root@k8s-master ~]#  kubectl label node k8s-node2 node-role.kubernetes.io/worker=worker

06、安装 Calico

安装 kubernetes 网络组件-Calico

下载 calico.yaml 到 k8s-master上,使用 yaml 文件安装 calico 网络插件

[root@k8s-master ~]# kubectl apply -f /etc/kubernetes/calico/calico.yaml



查看calico的pod状态  #STATUS 状态是 Ready,说明 k8s 集群正常运行了



[root@k8s-master ~]# kubectl get pod -n kube-system

kubeadm搭建测试环境k8s集群_程序员_06

07、部署 tomcat 服务

测试 k8s 集群中部署 tomcat 服务

[root@k8s-master ~]# vim  tomcat.yaml



apiVersion: v1  #pod属于k8s核心组v1

kind: Pod  #创建的是一个Pod资源

metadata:  #元数据

  name: demo-pod  #pod名字

  namespace: default  #pod所属的名称空间

  labels:

    app: myapp  #pod具有的标签

    env: dev      #pod具有的标签

spec:

  containers:      #定义一个容器,容器是对象列表,下面可以有多个name

  - name:  tomcat-pod-java  #容器的名字

    ports:

    - containerPort: 8080

    image: tomcat:8.5-jre8-alpine   #容器使用的镜像

    imagePullPolicy: IfNotPresent

    

[root@k8s-master ~]# kubectl apply -f tomcat.yaml   



[root@k8s-master ~]# kubectl get pods

kubeadm搭建测试环境k8s集群_自动化测试_07

[root@k8s-master ~]# vim   tomcat-service.yaml



apiVersion: v1

kind: Service

metadata:

  name: tomcat

spec:

  type: NodePort

  ports:

    - port: 8080

      nodePort: 30080

  selector:

    app: myapp

    env: dev

[root@k8s-master ~]# kubectl apply -f tomcat-service.yaml



[root@k8s-master ~]#  kubectl get svc

 

kubeadm搭建测试环境k8s集群_docker_08

在浏览器访问 k8s-node1 节点的 ip:30080 即可请求到浏览器

kubeadm搭建测试环境k8s集群_接口测试_09