kubernetes1.22集群环境安装

506 阅读3分钟

主要内容:主要参考了网上的两个博客,添加了安装过过程中遇到的问题,服务器,我是先安装了docker,后安装k8s

准备工作:

第一步、 三台centos7服务器(一主二从),我的机器是centos7.9,并且设置IP组成局域网,服务器之间设置SSH免密码远程登录。

安装 k8s 的节点必须是大于 1 核心的 CPU 安装节点的网络信息 master BOOTPROTO=static IPADDR=10.173.1.89 NETMASK=255.255.255.0 GATEWAY=10.173.1.254

node1 BOOTPROTO=static IPADDR=10.173.1.88 NETMASK=255.255.255.0 GATEWAY=10.173.1.254

node2 BOOTPROTO=static IPADDR=10.173.1.90 NETMASK=255.255.255.0 GATEWAY=10.173.1.254

集群安装

(以下操作三台机器都要执行)

系统初始化

设置系统主机名以及Host文件

hostnamectl set-hostname k8s-master01(10.0.100.10)
hostnamectl set-hostname k8s-node01(10.0.100.11)
hostnamectl set-hostname k8s-node02(10.0.100.12

安装依赖包

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git

设置防火墙为Iptables并设置空规则

systemctl stop firewalld && systemctl disable firewalld
yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save

关闭SELINUX
因为K8s安装的时候会去检测swap分区有无关闭,如果开启了话可能会把pod放在虚拟内存运行,大大降低工作效率。(也可以通过–ingress排除)

swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

调整内核参数,对于K8s

必备三调参数:开启bridge网桥模式,关闭ipv6协议

cat > kubernetes.conf << EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0 # 禁止使用swap空间,只有当系统OOM时才允许使用它
vm.overcommit_memory=1 # 不检查物理内存是否够用
vm.panic_on_oom=0 # 开启OOM
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF
cp kubernetes.conf /etc/sysctl.d/kubernetes.conf
sysctl -p /etc/sysctl.d/kubernetes.conf

调整系统时区

# 设置系统时区为 中国/上海
timedatectl set-timezone Asia/Shanghai
# 将当前的UTC时间写入硬件时钟
timedatectl set-local-rtc 0
# 重启依赖于系统时间的服务
systemctl restart rsyslog
systemctl restart crond

关闭系统不需要的服务

systemctl stop postfix && systemctl disable postfix

设置rsyslogd和systemd journald
让journald控制转发

mkdir /var/log/journal # 持久化保存日志的目录
mkdir /etc/systemd/journald.conf.d # 配置文件存放目录

创建配置文件

cat > /etc/systemd/journald.conf.d/99-prophet.conf << EOF
[Journal]
# 持久化保存到磁盘
Storage=persistent
# 压缩历史日志
Compress=yes
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
# 最大占用空间 10G
SystemMaxUse=10G
# 单日志文件最大 200M
SystemMaxFileSize=200M
# 日志保存时间2周
MaxRetentionSec=2week
# 不将日志转发到 syslog
ForwardToSyslog=no
EOF
systemctl restart systemd-journald

修改系统内核为4.44(实际调整成了5.4.197) CentOS 7.x系统自带的3.10x内核存在一些Bugs,导致运行的Docker、Kubernetes不稳定。

rpm -Uvh http://mirror.ventraip.net.au/elrepo/elrepo/el7/x86_64/RPMS/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
# 安装完成后检查 /boot/grub2/grub.cfg 中对应内核 menuentry 中是否包含 initrd16 配置,如果没有,再安装一次
yum --enablerepo=elrepo-kernel install -y kernel-lt
# 设置开机从新内核启动
grub2-set-default "CentOS Linux (4.4.182-1.el7.elrepo.x86_64) 7 (Core)"
[root@k8s-master01 ~]# uname -r

检测:

image.png

修改DNS

vim /etc/hosts
10.0.100.10 k8s-master01
10.0.100.11 k8s-node01
10.0.100.12 k8s-node02
(没有修改端口的就无需加-P )
scp -P 3388 /etc/hosts root@k8s-node01:/etc/hosts
scp -P 3388 /etc/hosts root@k8s-node02:/etc/hosts

kube-proxy开启ipvs的前置条件
kube-proxy主要解决 pod的调度方式,开启这个条件可以增加访问效率

modprobe br_netfilter

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(内核4.4)
#modprobe -- nf_conntrack(内核5.4 填这个,否则提示modprobe: FATAL: Module nf_conntrack_ipv4 not found)
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash
/etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack

安装Docker软件 (我安装的版本是20.10.16)

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 update -y && yum install -y docker-ce

创建/etc/docker目录

mkdir /etc/docker

配置daemon

cat > /etc/docker/daemon.json << EOF
{
        "registry-mirrors":["http://hubmirror.c.163.com","https://docker.mirrors.ustc.edu.cn"],
        "data-root":"/home/devmind/data/docker",
	"exec-opts":["native.cgroupdriver=systemd"],
	"log-driver":"json-file",
	"log-opts":{
		"max-size":"100m"
	}
}
EOF

创建存放docker的配置文件

mkdir -p /etc/systemd/system/docker.service.d

重启docker服务

systemctl daemon-reload && systemctl restart docker && systemctl enable docker

安装Kubeadm(主从配置)
让kubeadm去引导成为k8s 备注:三台机器都要执行

cat <<EOF >/etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum install -y kubectl-1.22.2 kubelet-1.22.2 kubeadm-1.22.2

kubelet是与容器接口进行交互,而k8s通过kubeadm安装以后都是以Pod方式存在,底层是以容器的方式运行。所以一定要开机自启,不然的话启动不了k8s集群

systemctl enable kubelet.service

初始化主节点 (在master机器上面操作) 方式一:使用kubeadm init命令初始化 备注:(如果先安装了docker,后安装K8S,/etc/docker/daemon.json文件的,内容调整成:"exec-opts":["native.cgroupdriver=systemd"],需要执行systemctl restart docker 重启docker,并且执行kubeadm reset后,重新初始化)

image.png

正常执行命令:

kubeadm init --apiserver-advertise-address=10.173.1.89 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.22.2 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=all

效果如下:

image.png

配置环境变量 (master节点)

  mkdir -p $HOME/.kube
  cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  chown $(id -u):$(id -g) $HOME/.kube/config
  export KUBECONFIG=/etc/kubernetes/admin.conf

image.png

复制docker配置文件到node1和node2

scp -P 3388 /etc/docker/daemon.json root@root@k8s-node01:/etc/docker/
scp -P 3388 /etc/docker/daemon.json root@root@k8s-node02:/etc/docker/

重启node1和node2的docker

service docker restart

node1和node2加入集群

node1和node2集群执行命令:

kubeadm join 10.173.1.89:6443 --token 8hhfos.pxp8xyqaccotmvjh         --discovery-token-ca-cert-hash sha256:c4e0509472a75522b86f4bce8b2ebe82eafb73f553aa753fa25ad95506bef003

master节点报错

Get "https://127.0.0.1:10257/healthz": dial tcp 127.0.0.1:10257: connect: connection refused

编辑文件

vim /etc/kubernetes/manifests/kube-controller-manager.yaml
vim /etc/kubernetes/manifests/kube-scheduler.yaml

image.png

image.png

执行 kubectl get cs命令后,显示正常(若不正确,执行systemctl daemon-reload && systemctl restart kubelet再查看状态) image.png

node节点加入失败错误信息 备注:可先解决master节点错误,再来解决node节点错误。

Unable to update cni config" err="no networks found in /etc/cni/net.d

Jun 08 00:17:43 k8s-master01 kubelet[10321]: E0608 00:17:43.739129   10321 kubelet.go:2332] "Container runtime network not ready" networkReady="NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized"

处理方案: 复制master机器的配置文件到node1和node2

scp -r -P 3388 /etc/cni root@k8s-node01:/etc/
scp -r -P 3388 /etc/cni root@k8s-node02:/etc/

master节点和node节点错误

image.png 解决方法:分别执行以下命令

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile
systemctl daemon-reload && systemctl restart kubelet

image.png

安装容器网络

网络组件有很多种,只需要部署其中一个即可,推荐Calico。

Calico是一个纯三层的数据中心网络方案,Calico支持广泛的平台,包括Kubernetes、OpenStack等。

Calico 在每一个计算节点利用 Linux Kernel 实现了一个高效的虚拟路由器( vRouter) 来负责数据转发,而每个 vRouter 通过 BGP 协议负责把自己上运行的 workload 的路由信息向整个 Calico 网络内传播。

此外,Calico 项目还实现了 Kubernetes 网络策略,提供ACL功能。

去github上面下载最新版本,上传到master服务器,打开CALICO_IPV4POOL_CIDR节点,(建议先再本地修改完成后,校验格式无误再上传) image.png 执行下面命令进行安装

kubectl apply -f calico.yaml

安装成功后,如下图所示 image.png

image.png

node节点: 加入集群 cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

部署dashboard

下载yaml文件,去github下载2.6版本 修改recommended.yaml文件,需要在下图位置添加NodePort,否则会报错

kubernetes-dashboard" is invalid: spec.ports[0].nodePort: Forbidden: may not be used when `type` is 

image.png

kubectl apply -f recommended.yaml

kubectl get pods -n kubernetes-dashboard
kubectl get pods,svc -n kubernetes-dashboard

创建用户

kubectl create serviceaccount dashboard-admin -n kube-system

用户授权

kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin

获取用户Token

kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

复制token值,登录的时候需要用到

image.png

1654663914727.jpg

新增机器加入到机器

image.png 提示错误:could not find a JWS signature in the cluster-info ConfigMap for token ID "ied8i9" 原因:令牌过期 解决方法: master节点:执行

kubeadm token create --print-join-command
kubeadm join 10.173.1.89:6443 --token lwnw6x.wnwia13rtmlc86op --discovery-token-ca-cert-hash sha256:be5dd9fa0bf828a62e5ef7633b9c1f3de282cfcd13aa035b3965d53de2ff9706

转载博客 前半部分参考

(40条消息) Kubernetes(K8S)集群部署搭建图文教程(最全)_果子哥丶的博客-CSDN博客_k8s部署

后半部分参考

k8s 1.22.4 kubeadm 部署_flyfish的技术博客_51CTO博客