学习笔记十一:Kubeadm安装K8S单master节点测试环境集群

这里写目录标题

  • 环境规划
  • 插件网盘链接
  • 初始化安装k8s集群的实验环境k8smaster1
      • 关闭交换分区swap,提升性能
      • 修改机器内核参数
      • 配置安装k8s组件需要的阿里云的repo源
      • 安装基础软件包
      • 安装docker-ce
      • 安装初始化k8s需要的软件包
  • 关机以便node克隆
      • kubeadm初始化k8s集群
  • kubeadm init初始化流程分析
      • kubeadm 在执行安装之前进行了相当细致的环境检测
      • 完成安装前的配置
  • k8s集群-添加第一个工作节点
      • 关闭交换分区swap,提升性能
      • 修改机器内核参数
      • 配置安装k8s组件需要的阿里云的repo源
      • 安装基础软件包
      • 安装docker-ce
      • 安装初始化k8s需要的软件包
  • 安装kubernetes网络组件-Calico
  • 测试在k8s创建pod是否可以正常访问网络
  • 测试coredns是否正常

环境规划

podSubnet(pod网段) 10.244.0.0/16
serviceSubnet(service网段): 10.96.0.0/16
物理机网段:192.168.40.0/24

实验环境规划:
操作系统:centos7.9
配置: 4Gib内存/4vCPU/60G硬盘
网络:NAT

学习笔记十一:Kubeadm安装K8S单master节点测试环境集群_第1张图片

查看自己电脑几核的CPU
学习笔记十一:Kubeadm安装K8S单master节点测试环境集群_第2张图片
学习笔记十一:Kubeadm安装K8S单master节点测试环境集群_第3张图片
学习笔记十一:Kubeadm安装K8S单master节点测试环境集群_第4张图片
master:apiserver,controller-manager,etcd,scheduler,docker,kube-proxy,calico
node:kubelet,kube-proxy,docker,calico,coredns

插件网盘链接

百度云网盘
https://pan.baidu.com/s/1oN4x61NVvRUnuYnTn4IA2g
提取码:gog3

初始化安装k8s集群的实验环境k8smaster1

参考:学习笔记一:VMware配置虚拟机centos并初始化
https://blog.csdn.net/weixin_43258559/article/details/122121258

vi /etc/sysconfig/network-scripts/ifcfg-ens33
这里的网卡配置,DNS1一定要与网关一致

GATEWAY=192.168.40.2
DNS1=192.168.40.2

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

swapoff -a

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

vim /etc/fstab 
#/dev/mapper/centos-swap swap      swap    defaults        0 0

为什么要关闭swap交换分区?
Swap是交换分区,如果机器内存不够,会使用swap分区,但是swap分区的性能较低,k8s设计的时候为了能提升性能,默认是不允许使用交换分区的。Kubeadm初始化的时候会检测swap是否关闭,如果没关闭,那就初始化失败。如果不想要关闭交换分区,安装k8s的时候可以指定–ignore-preflight-errors=Swap来解决。

修改机器内核参数

modprobe br_netfilter
echo "modprobe br_netfilter" >> /etc/profile
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 -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转发功能已经打开。

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

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
EOF

安装基础软件包

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 vim ncurses-devel autoconf automake zlib-devel  python-devel epel-release openssh-server socat  ipvsadm conntrack ntpdate telnet ipvsadm

安装docker-ce

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce-20.10.6 docker-ce-cli-20.10.6 containerd.io  -y
systemctl start docker && systemctl enable docker && systemctl status docker

配置docker镜像加速器和驱动

cat >/etc/docker/daemon.json <<EOF
{
 "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"]
} 
EOF

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

systemctl daemon-reload  && systemctl restart docker
systemctl status docker

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

yum install -y kubelet-1.20.6 kubeadm-1.20.6 kubectl-1.20.6

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

docker load -i k8simage-1-20-6.tar.gz

关机以便node克隆

最好在上面这步做完后,把k8smaster1关机,然后创建快照,以便node克隆,克隆好的node,更改IP,hostname后就可以直接加到k8smaster1了

kubeadm初始化k8s集群

使用kubeadm初始化k8s集群
根据我们自己的需求修改配置,比如修改 imageRepository 的值,kube-proxy 的模式为 ipvs,初始化节点的时候需要指定cgroupDriver为systemd

kubeadm config print init-defaults > kubeadm.yaml

基于kubeadm.yaml文件初始化k8s
k8smaster1执行,node节点是不做的

kubeadm.yaml配置如下:

cat >kubeadm.yaml<<EOF
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.40.10 #控制节点的ip
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: k8smaster1 #控制节点主机名
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.20.6
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
  podSubnet: 10.244.0.0/16 #指定pod网段, 需要新增加这个
scheduler: {}
#追加如下几行
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
EOF
kubeadm init --config=kubeadm.yaml --ignore-preflight-errors=SystemVerification

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

学习笔记十一:Kubeadm安装K8S单master节点测试环境集群_第5张图片

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

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

在这里插入图片描述

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

kubeadm init初始化流程分析

学习笔记十一:Kubeadm安装K8S单master节点测试环境集群_第6张图片

注意:操作系统需要我们手动配置好,包括防火墙、swap、selinux关掉

kubeadm 在执行安装之前进行了相当细致的环境检测

  1. 检查执行 init 命令的用户是否为 root,如果不是 root,直接快速失败(fail fast);
  2. 检查待安装的 k8s 版本是否被当前版本的 kubeadm 支持(kubeadm 版本 >= 待安装 k8s 版本);
  3. 检查防火墙,如果防火墙未关闭,提示开放端口 10250;
  4. 检查端口是否已被占用,6443(或你指定的监听端口)、10257、10259;
  5. 检查文件是否已经存在,/etc/kubernetes/manifests/*.yaml;
  6. 检查是否存在代理,连接本机网络、服务网络、Pod网络,都会检查,目前不允许代理;
  7. 检查容器运行时,使用 CRI 还是 Docker,如果是 Docker,进一步检查 Docker 服务是否已启动,是否设置了开机自启动;
  8. 对于 Linux 系统,会额外检查以下内容:
    8.1) 检查以下命令是否存在:crictl、ip、iptables、mount、nsenter、ebtables、ethtool、socat、tc、touch;
    8.2) 检查 /proc/sys/net/bridge/bridge-nf-call-iptables、/proc/sys/net/ipv4/ip-forward 内容是否为 1;
    8.3) 检查 swap 是否是关闭状态;
  9. 检查内核是否被支持,Docker 版本及后端存储 GraphDriver 是否被支持;对于 Linux 系统,还需检查 OS 版本和 cgroup 支持程度(支持哪些资源的隔离);
  10. 检查主机名访问可达性;
  11. 检查 kubelet 版本,要高于 kubeadm 需要的最低版本,同时不高于待安装的 k8s 版本;
  12. 检查 kubelet 服务是否开机自启动;
  13. 检查 10250 端口是否被占用;
  14. 如果开启 IPVS 功能,检查系统内核是否加载了 ipvs 模块;
  15. 对于 etcd,如果使用 Local etcd,则检查 2379 端口是否被占用, /var/lib/etcd/ 是否为空目录; 如果使用 External etcd,则检查证书文件是否存在(CA、key、cert),验证 etcd 服务版本是否符合要求;
  16. 如果使用 IPv6,
    检查 /proc/sys/net/bridge/bridge-nf-call-iptables、/proc/sys/net/ipv6/conf/default/forwarding 内容是否为 1;
    以上就是 kubeadm init 需要检查的所有项目了!

完成安装前的配置

  1. 在 kube-system 命名空间创建 ConfigMap kubeadm-config,同时对其配置 RBAC 权限;
  2. 在 kube-system 命名空间创建 ConfigMap kubelet-config-,同时对其配置 RBAC 权限;
  3. 为当前节点(Master)打标记:node-role.kubernetes.io/master=;
  4. 为当前节点(Master)补充 Annotation;
  5. 如果启用了 DynamicKubeletConfig 特性,设置本节点 kubelet 的配置数据源为 ConfigMap 形式;
  6. 创建 BootStrap token Secret,并对其配置 RBAC 权限;
  7. 在 kube-public 命名空间创建 ConfigMap cluster-info,同时对其配置 RBAC 权限;
  8. 与 apiserver 通信,部署 DNS 服务;
  9. 与 apiserver 通信,部署 kube-proxy 服务;
  10. 如果启用了 self-hosted 特性,将 Control Plane 转为 DaemonSet 形式运行;
  11. 打印 join 语句;

k8s集群-添加第一个工作节点

虚拟机初始化参考:学习笔记一:VMware配置虚拟机centos并初始化
https://blog.csdn.net/weixin_43258559/article/details/122121258

  • 也可以克隆k8smaster1 在 安装初始化k8s需要的软件包 这步的快照
  • 使用k8smaster1快照,更改IP和hostname后直接加入到k8smaster1,要加参数–ignore-preflight-errors=SystemVerification
kubeadm join 192.168.40.10:6443 --token abcdef.0123456789abcdef \
>     --discovery-token-ca-cert-hash sha256:c88304bde9d24cd877f7242039a164f9b1307cb06354cf61c69d338cfe938c08 --ignore-preflight-errors=SystemVerification

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

swapoff -a

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

vim /etc/fstab 
#/dev/mapper/centos-swap swap      swap    defaults        0 0

修改机器内核参数

modprobe br_netfilter
echo "modprobe br_netfilter" >> /etc/profile
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 -p /etc/sysctl.d/k8s.conf

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

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

安装基础软件包

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 vim ncurses-devel autoconf automake zlib-devel  python-devel epel-release openssh-server socat  ipvsadm conntrack ntpdate telnet ipvsadm

安装docker-ce

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce-20.10.6 docker-ce-cli-20.10.6 containerd.io  -y
systemctl start docker && systemctl enable docker && systemctl status docker

配置docker镜像加速器和驱动

cat >/etc/docker/daemon.json <<EOF
{
 "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"]
} 
EOF

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

systemctl daemon-reload  && systemctl restart docker
systemctl status docker

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

yum install -y kubelet-1.20.6 kubeadm-1.20.6 kubectl-1.20.6

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

docker load -i k8simage-1-20-6.tar.gz

在k8smaster1上查看加入节点的命令:

kubeadm token create --print-join-command

学习笔记十一:Kubeadm安装K8S单master节点测试环境集群_第7张图片

在k8snode1节点执行上面获取到的值,并添加参数–ignore-preflight-errors=SystemVerification

kubeadm join 192.168.40.10:6443 --token abcdef.0123456789abcdef \
>     --discovery-token-ca-cert-hash sha256:c88304bde9d24cd877f7242039a164f9b1307cb06354cf61c69d338cfe938c08 --ignore-preflight-errors=SystemVerification

学习笔记十一:Kubeadm安装K8S单master节点测试环境集群_第8张图片

在k8smaster1上查看集群节点状况:

kubectl get nodes

学习笔记十一:Kubeadm安装K8S单master节点测试环境集群_第9张图片

k8s集群-添加第二个工作节点也和上面这个步骤一样

安装kubernetes网络组件-Calico

上传calico.yaml到k8smaster1上,使用yaml文件安装calico 网络插件 。

kubectl apply -f  calico.yaml
#注:在线下载配置文件地址是:https://docs.projectcalico.org/manifests/calico.yaml

学习笔记十一:Kubeadm安装K8S单master节点测试环境集群_第10张图片

等一分钟左右再次查看集群状态

kubectl get pod -n kube-system 
kubectl get nodes

学习笔记十一:Kubeadm安装K8S单master节点测试环境集群_第11张图片

#STATUS状态是Ready,说明k8s集群正常运行了
可以看到k8snode1的ROLES角色为空,就表示这个节点是工作节点。
可以把k8snode1的ROLES变成work,按照如下方法:

kubectl label node k8snode1 node-role.kubernetes.io/worker=worker

测试在k8s创建pod是否可以正常访问网络

把busybox-1-28.tar.gz上传到k8snode1、k8snode2节点,手动解压

docker load -i busybox-1-28.tar.gz
kubectl run busybox --image busybox:1.28 --image-pull-policy=IfNotPresent --restart=Never --rm -it busybox -- sh
ping www.baidu.com

学习笔记十一:Kubeadm安装K8S单master节点测试环境集群_第12张图片

通过上面可以看到能访问网络,说明calico网络插件已经被正常安装了

测试coredns是否正常

kubectl run busybox --image busybox:1.28 --restart=Never --rm -it busybox -- sh
nslookup kubernetes.default.svc.cluster.local

学习笔记十一:Kubeadm安装K8S单master节点测试环境集群_第13张图片

10.96.0.10 就是我们coreDNS的clusterIP,说明coreDNS配置好了。
解析内部Service的名称,是通过coreDNS去解析的。
特别注意:busybox要用指定的1.28版本,不能用最新版本,最新版本,nslookup会解析不到dns和ip

你可能感兴趣的:(CKA学习笔记,kubernetes,学习,docker)