实验环境规划:
操作系统:centos7.6
配置: 4Gib 内存/6vCPU/100G 硬盘
网络:NAT
开启虚拟机的虚拟化:
1、初始化安装 k8s 集群的实验环境
1.1 修改机器 IP,变成静态 IP
vim /etc/sysconfig/network-scripts/ifcfg-ens33
文件
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
IPADDR=192.168.40.180
NETMASK=255.255.255.0
GATEWAY=192.168.40.2
DNS1=192.168.40.2
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
DEVICE=ens33
ONBOOT=yes
#修改配置文件之后需要重启网络服务才能使配置生效,重启网络服务命令如下:
service network restart
注:/etc/sysconfig/network-scripts/ifcfg-ens33
文件里的配置说明:
NAME=ens33 #网卡名字,跟 DEVICE 名字保持一致即可
DEVICE=ens33 #网卡设备名,大家 ip addr 可看到自己的这个网卡设备名,每个人的机器可能这个名
字不一样,需要写自己的
BOOTPROTO=static #static 表示静态 ip 地址
ONBOOT=yes #开机自启动网络,必须是 yes
IPADDR=192.168.40.180 #ip 地址,需要跟自己电脑所在网段一致
NETMASK=255.255.255.0 #子网掩码,需要跟自己电脑所在网段一致
GATEWAY=192.168.40.2 #网关,在自己电脑打开 cmd,输入 ipconfig /all 可看到
DNS1=192.168.40.2 #DNS,在自己电脑打开 cmd,输入 ipconfig /all 可看到
1.2 配置机器主机名
在 192.168.40.180 上执行如下:
hostnamectl set-hostname xianchaomaster1 && bash
在 192.168.40.181 上执行如下:
hostnamectl set-hostname xianchaonode1 && bash
1.3 配置主机 hosts 文件,相互之间通过主机名互相访问
修改每台机器的/etc/hosts 文件,增加如下三行:
192.168.40.180 xianchaomaster1
192.168.40.181 xianchaonode1
1.4 配置主机之间无密码登录
[root@xianchaomaster1 ~]# ssh-keygen #一路回车,不输入密码
把本地生成的密钥文件和私钥文件拷贝到远程主机
[root@xianchaomaster1 ~]# ssh-copy-id xianchaomaster1
[root@xianchaomaster1 ~]# ssh-copy-id xianchaonode1
[root@ xianchaonode1 ~]# ssh-keygen #一路回车,不输入密码把本地生成的密钥文件和私钥文件拷贝到远程主机
[root@ xianchaonode1 ~]# ssh-copy-id xianchaomaster1
[root@xianchaonode1 ~]# ssh-copy-id xianchaonode1
1.5 关闭交换分区 swap,提升性能
#临时关闭
[root@xianchaomaster1 ~]# swapoff -a
[root@xianchaonode1 ~]# swapoff -a
#永久关闭:注释 swap 挂载,给 swap 这行开头加一下注释
[root@xianchaomaster1 ~]# vim /etc/fstab
#/dev/mapper/centos-swap swap swap defaults 0 0
[root@ xianchaonode1 ~]# vim /etc/fstab
#/dev/mapper/centos-swap swap swap defaults 0 0
问题 1:为什么要关闭 swap 交换分区?
Swap 是交换分区,如果机器内存不够,会使用 swap 分区,但是 swap 分区的性能较低,k8s 设计的
时候为了能提升性能,默认是不允许使用交换分区的。Kubeadm 初始化的时候会检测 swap 是否关
闭,如果没关闭,那就初始化失败。如果不想要关闭交换分区,安装 k8s 的时候可以指定--ignore-
preflight-errors=Swap 来解决。
1.6 修改机器内核参数
[root@xianchaomaster1 ~]# modprobe br_netfilter
[root@xianchaomaster1 ~]# echo "modprobe br_netfilter" >> /etc/profile
[root@xianchaomaster1 ~]# 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
[root@xianchaomaster1 ~]# sysctl -p /etc/sysctl.d/k8s.conf
[root@xianchaonode1 ~]# modprobe br_netfilter
[root@xianchaonode1 ~]# echo "modprobe br_netfilter" >> /etc/profile
[root@xianchaonode1 ~]# 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
[root@xianchaonode1 ~]# sysctl -p /etc/sysctl.d/k8s.conf
问题 1:sysctl 是做什么的?
在运行时配置内核参数
-p 从指定的文件加载系统参数,如不指定即从/etc/sysctl.conf 中加载
问题 2:为什么要执行 modprobe br_netfilter?
修改/etc/sysctl.d/k8s.conf
文件,增加如下三行参数:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
sysctl -p /etc/sysctl.d/k8s.conf 出现报错:
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: No such file or
directory
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: No such file or
directory
解决方法:
modprobe br_netfilter
问题 3:为什么开启 net.bridge.bridge-nf-call-iptables 内核参数?
在 centos 下安装 docker,执行 docker info 出现如下警告:
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
解决办法:
vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
问题 4:为什么要开启 net.ipv4.ip_forward = 1 参数?
kubeadm 初始化 k8s 如果报错:
就表示没有开启 ip_forward,需要开启。
net.ipv4.ip_forward 是数据包转发:
出于安全考虑,Linux 系统默认是禁止数据包转发的。所谓转发即当主机拥有多于一块的网卡时,
其中一块收到数据包,根据数据包的目的 ip 地址将数据包发往本机另一块网卡,该网卡根据路由表继
续发送数据包。这通常是路由器所要实现的功能。
要让 Linux 系统具有路由转发功能,需要配置一个 Linux 的内核参数 net.ipv4.ip_forward。这个
参数指定了 Linux 系统当前对路由转发功能的支持情况;其值为 0 时表示禁止进行 IP 转发;如果是 1,
则说明 IP 转发功能已经打开。
1.7 关闭 firewalld 防火墙
[root@xianchaomaster1 ~]# systemctl stop firewalld ; systemctl disable firewalld
[root@xianchaonode1 ~]# systemctl stop firewalld ; systemctl disable firewalld
1.7 关闭 selinux
[root@xianchaomaster1 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g'
/etc/selinux/config
#修改 selinux 配置文件之后,重启机器,selinux 配置才能永久生效
[root@xianchaonode1 ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g'
/etc/selinux/config
#修改 selinux 配置文件之后,重启机器,selinux 配置才能永久生效
[root@xianchaomaster1 ~]#getenforce
Disabled
#显示 Disabled 说明 selinux 已经关闭
[root@xianchaonode1 ~]#getenforce
Disabled
#显示 Disabled 说明 selinux 已经关闭
1.8 配置阿里云的 repo 源
#配置国内阿里云 docker 的 repo 源
[root@xianchaomaster1 ~]#yum install yum-utils -y
[root@xianchaonode1 ~]#yum install yum-utils -y
[root@xianchaomaster1 ~]# yum-config-manager --add-repo
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@xianchaonode1 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
1.9 配置安装 k8s 组件需要的阿里云的 repo 源
[root@xianchaomaster1 ~]#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
#将 xianchaomaster1 上 Kubernetes 的 repo 源复制给 xianchaonode1
[root@xianchaomaster1 ~]# scp /etc/yum.repos.d/kubernetes.repo
xianchaonode1:/etc/yum.repos.d/
1.10 配置时间同步
在 xianchaomaster1 上执行如下:
#安装 ntpdate 命令
[root@xianchaomaster1 ~]# yum install ntpdate -y
#跟网络时间做同步
[root@xianchaomaster1 ~]# ntpdate cn.pool.ntp.org
#把时间同步做成计划任务
[root@xianchaomaster1 ~]# crontab -e
* */1 * * * /usr/sbin/ntpdate cn.pool.ntp.org
#重启 crond 服务
[root@xianchaomaster1 ~]#service crond restart
在 xianchaonode1 上执行如下:
#安装 ntpdate 命令
[root@ xianchaonode1 ~]# yum install ntpdate -y
#跟网络时间做同步
[root@ xianchaonode1 ~]#ntpdate cn.pool.ntp.org
#把时间同步做成计划任务
[root@ xianchaonode1 ~]#crontab -e
* */1 * * * /usr/sbin/ntpdate cn.pool.ntp.org
#重启 crond 服务
[root@ xianchaonode1 ~]#service crond restart
1.11 安装基础软件包
[root@xianchaomaster1 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl
curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-
devel python-devel epel-release openssh-server socat ipvsadm conntrack ntpdate telnet
ipvsadm
[root@xianchaonode1 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl
curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-
devel python-devel epel-release openssh-server socat ipvsadm conntrack ntpdate telnet
ipvsadm
2、安装 docker 服务
2.1 安装 docker-ce
[root@xianchaomaster1 ~]# yum install docker-ce -y
[root@xianchaomaster1 ~]# systemctl start docker && systemctl enable docker.service
[root@xianchaonode1 ~]# yum install docker-ce -y
[root@xianchaonode1 ~]# systemctl start docker && systemctl enable docker.service
2.2 配置 docker 镜像加速器和驱动
[root@xianchaomaster1 ~]#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@xianchaomaster1 ~]# systemctl daemon-reload && systemctl restart docker
[root@xianchaomaster1 ~]# systemctl status docker
[root@ xianchaonode1 ~]#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"]
}
[root@xianchaonode1 ~]# systemctl daemon-reload
[root@xianchaonode1 ~]# systemctl restart docker
[root@xianchaonode1 ~]# systemctl status docker
3、安装初始化 k8s 需要的软件包
[root@xianchaomaster1 ~]# yum install -y kubelet-1.23.1 kubeadm-1.23.1 kubectl-1.23.1
[root@xianchaomaster1 ~]# systemctl enable kubelet
[root@xianchaonode1 ~]# yum install -y kubelet-1.23.1 kubeadm-1.23.1 kubectl-1.23.1
[root@xianchaonode1 ~]# systemctl enable kubelet
注:每个软件包的作用
Kubeadm: kubeadm 是一个工具,用来初始化 k8s 集群的
kubelet: 安装在集群所有节点上,用于启动 Pod 的
kubectl: 通过 kubectl 可以部署和管理应用,查看各种资源,创建、删除和更新各种组件
5、kubeadm 初始化 k8s 集群
#把初始化 k8s 集群需要的离线镜像包上传到 xianchaomaster1、xianchaonode1 机器上,手动解
压:
[root@xianchaomaster1 ~]# docker load -i k8s-images-v1.23.1.tar.gz
[root@xianchaonode1 ~]# docker load -i k8s-images-v1.23.1.tar.gz
#使用 kubeadm 初始化 k8s 集群
[root@xianchaomaster1 ~]# kubeadm init --kubernetes-version=1.23.1 --apiserver-
advertise-address=192.168.40.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 join 192.168.40.180:6443 --token gsa9je.x35o1gfhd4hq26ci \
--discovery-token-ca-cert-hash
sha256:8c18c824fcc6f91dd03205e63005cfeef36061f86d1b14a3ee562a6eb6ad4447
#上面命令是把 node 节点加入集群,需要保存下来,每个人的都不一样
#配置 kubectl 的配置文件 config,相当于对 kubectl 进行授权,这样 kubectl 命令可以使用这个证
书对 k8s 集群进行管理
[root@xianchaomaster1 ~]# mkdir -p $HOME/.kube
[root@xianchaomaster1 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@xianchaomaster1 ~]# sudo chown \((id -u):\)(id -g) $HOME/.kube/config
[root@xianchaomaster1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
xianchaomaster1 NotReady control-plane,master 60s v1.23.1
此时集群状态还是 NotReady 状态,因为没有安装网络插件。
6、扩容 k8s 集群-添加第一个工作节点
在 xianchaomaster1 上查看加入节点的命令:
[root@xianchaomaster1 ~]# kubeadm token create --print-join-command
显示如下:
kubeadm join 192.168.40.180:6443 --token vulvta.9ns7da3saibv4pg1 --discovery-token-
ca-cert-hash sha256:72a0896e27521244850b8f1c3b600087292c2d10f2565adb56381f1f4ba7057a
把 xianchaonode1 加入 k8s 集群:
[root@xianchaonode1~]# kubeadm join 192.168.40.180:6443 --token vulvta.9ns7da3saibv4pg1
--discovery-token-ca-cert-hash sha256:72a0896e27521244850b8f1c3b600087292c2d10f2565adb56381f1f4ba7057a
#看到上面说明 xianchaonode1 节点已经加入到集群了,充当工作节点
#在 xianchaomaster1 上查看集群节点状况:
[root@xianchaomaster1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
xianchaomaster1 NotReady control-plane,master 53m v1.23.1
xianchaonode1 NotReady
7、安装 kubernetes 网络组件-Calico
上传 calico.yaml 到 xianchaomaster1 上,使用 yaml 文件安装 calico 网络插件 。
[root@xianchaomaster1 ~]# kubectl apply -f calico.yaml
注:在线下载配置文件地址是: https://docs.projectcalico.org/manifests/calico.yaml
。
[root@xianchaomaster1 ~]# kubectl get pod -n kube-system
再次查看集群状态。
[root@xianchaomaster1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
xianchaomaster1 Ready control-plane,master 58m v1.23.1
xianchaonode1 Ready
8、测试在 k8s 创建 pod 是否可以正常访问网络
#把 busybox-1-28.tar.gz 上传到 xianchaonode1 节点,手动解压
[root@xianchaonode1 ~]# docker load -i busybox-1-28.tar.gz
[root@xianchaomaster1 ~]# kubectl run busybox --image busybox:1.28 --restart=Never --rm
-it busybox -- sh
/ # ping www.baidu.com
PING www.baidu.com (39.156.66.18): 56 data bytes
64 bytes from 39.156.66.18: seq=0 ttl=127 time=39.3 ms
#通过上面可以看到能访问网络,说明 calico 网络插件已经被正常安装了
9、测试 coredns 是否正常
[root@xianchaomaster1 ~]# kubectl run busybox --image busybox:1.28 --restart=Never --rm
-it busybox -- sh
/ # nslookup kubernetes.default.svc.cluster.local
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
Name: kubernetes.default.svc.cluster.local
Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local
10.96.0.10 就是我们 coreDNS 的 clusterIP,说明 coreDNS 配置好了。
解析内部 Service 的名称,是通过 coreDNS 去解析的。
#注意:
busybox 要用指定的 1.28 版本,不能用最新版本,最新版本,nslookup 会解析不到 dns 和 ip