一、概述
Kubernetes是一个Google开源的全新的分布式容器集群管理系统,由于从第一个字母到字母s中间有8个字母,所以简称K8s。
二、准备
ip | 角色 | 内存 |
---|---|---|
192.168.187.130 | master | 4G |
192.168.187.131 | node | 2G |
192.168.187.132 | node | 2G |
小提示: 设置静态ip的步骤,请看https://blog.csdn.net/u010132847/article/details/135991017?spm=1001.2014.3001.5501
说明:本次是在Wndow10系统上安装,CentOS是7.9版本。
三、安装
3.1、共性操作
该操作要求每个节点均需执行的操作,包括修改hosts、时间同步、禁用firewalld、禁用selinux、禁用swap、网桥设置和安装K8s等。
3.1.1、修改hosts
$: cat >> /etc/hosts <<EOF
192.168.187.130 master
192.168.187.131 node1
192.168.187.132 node2
EOF
3.1.2、时间同步(本次使用chrony方式同步)
$: yum -y install chrony #安装chrony
$: systemctl enable --now chronyd #启动chrony服务
$: vim /etc/chrony.conf #修改配置文件,内容看说明
$: systemctl restart chronyd #重启chrony
$: hwclock -w #硬件时间向系统时间同步
$: date #查看时间是否正确
说明:编辑文件chrony.conf时,注释已有的server开头的配置,新增“server npt.aliyun.com iburst”.
chrony.conf文件原来内容:
chrony.conf文件修改后的内容:
3.1.3、禁用firewalld
$: systemctl stop firewalld #停止firewalld服务
$: systemctl disable firewalld #开机禁止启动
3.1.4、禁用selinux
$: setenforce 0 #临时关闭
$: vim /etc/selinux/config #永久关闭
...
SELINUX=disabled #值由enforcing改成disabled
...
小提示:
1、操作/etc/selinux/config时,将“SELINUX=enforcing”改成“SELINUX=disabled”,并且需要重启后才会生效,如下图。
3.1.5、禁用swap
$:swapoff -a #临时关闭
$:vim /etc/fstab #永久关闭
...
#/dev/mapper/centos-swap swap swap defaults 0 0 ##注释掉这一行
...
说明:默认情况下,K8s为了追求高性能,不建议使用交换分区,为此它要求每个节点禁用swap,否则各个节点中的kubelet无法运行。
3.1.6、网桥设置
$: cat > /etc/sysctl.d/kubernetes.conf << EOF
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
net.ipv4.ip_forward=1
EOF
$: systemctl --system #将设置生效
3.1.7、安装docker
1)安装
$:yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
$:yum makecache fast
$:yum -y install docker-ce
$:systemctl enable docker && systemctl start docker
$:docker -v
小提示:
1、如果执行“yum-config-manager”出现“yum-config-manager: command not found”时,则需要安装,命令如“yum -y install yum-utils”。
注意:yum -y install docker只能安装docker-1.13.x老版本的docker, 2017年后版本有了ce(社区版本)和EE(企业版本),所以新版本使用yum -y install docker-ce。
2)设置镜像地址
为了快速让docker从第三方公共镜像仓库中下载镜像,我们改成阿里云。默认是从国外的网址下载比较慢,我们改成从阿里云下载, 设置daemon.json:
$: mkdir -p /etc/docker
$: tee /etc/docker/daemon.json <<-'EOF'
{
"exec-opts":["native.cgroupdriver=systemd"],
"registry-mirrors":["https://ha65u7j9.mirror.aliyuns.com"]
}
EOF
$:systemctl daemon-reload && systemctl restart docker #重新加载并重启docker
说明:在某个节点(master节点或node节点)中运行cat /var/lib/kubelet/config.yaml|grep group命令可以看出kubelet默认cgroup驱动为systemd, 而docker默认驱动为cgroupfs,但k8s官网要求docker和kubelet服务中的cgroup驱动必须一致,为此设置daemon.json时添加了"exec-opts":[“native.cgroupdriver=systemd”]配置。
3.1.8、安装K8S
- 镜像
$: cat > /etc/yum.repos.d/kubernetes.repo << EOF
[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
$: cat /etc/yum.repos.d/kubernetes.repo #查看文件内容是否成功写入
- 安装
$:yum install -y kubeadm-1.23.17 kubectl-1.23.17 kubelet-1.23.17
$:systemctl enable kubelet #启动kubelet
$:journalctl -xefu kubelet #查看kubelet运行日志
kubelet运行日志如下:
3.2、异性操作
K8s环境搭建过程中有些命令需要在不同角色的节点执行,异性操作罗列了不同角色计算机执行的命令。
3.2.1、master操作
- 设置hostname:
$: hostnamectl set-hostname master
2)初始化Kubernetes, 保存该命令输出的一个join命令, 该join命令需要在node角色的节点上执行。
$: kubeadm init \
--apiserver-advertise-address=192.168.187.130 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.17 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=all
说明:
apiserver-advertise-address: 集群通告地址(master机器ip)
image-repository: 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
kubernetes-version: k8s版本,与上面安装的一致
service-cidr: 集群内部虚拟网络,pod统一访问入口
pot-network-cidr: pod网络,与下面部署的CNI网络组件yami中保持一致
提示:执行完命令后,最后的“kubeadm join …”内容需要记下来,后面配置node节点时用到。
3)环境配置
如果是普通用户执行如下:
$: mkdir -p $HOME/.kube
$: sudo cp -i /etc/kubernetes/admin.conf $Home/.kube/config
$: sudo chown $(id -u):$(id -g) $HOME/.kube/config
如果是root用户执行如下:
$: echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile
$: source /etc/profile
如果不配置环境变量,则执行时会提示如下错误:
[root@master ~]# kubectl get node
The connection to the server localhost:8080 was refused - did you specify the right host or port?
4)配置flannel
flannel([ˈflænl])和calico([ˈkælɪkoʊ])都是用于k8s节点之间容器网络通信的一个k8s组件,flannel可以为不同node节点的分配不同的子网,实现容器间的跨机通信,从而实现整个kubernetes层级通信。
- 下载:
$: cd /opt
$: wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
小提示:如果一直下载不下来,可以在/etc/hosts文件中添加一条“199.232.68.133 raw.githubusercontent.com”再下载(配置后仍让下载不下来,多执行几次可以成功)。
- 上传
$: kubectl apply -f /opt/kube-flannel.yml
3.2.2、node操作
1)设置hostname
$:hostnamectl set-hostname node[n]
每个node节点都要执行上面命令,n的值和/etc/hosts文件丛节点相一致。
2)执行kubeadm join命令,该命令是master节点初始化k8s时生成的(在步骤3.2.1的第二步生成的)。
$: kubeadm join 192.168.187.130:6443 --token l8z2iz.yoh8hzigfnlkea4t \
--discovery-token-ca-cert-hash sha256:e7386bef149c10542bd2a442079587587175918459501cbc71815db1fb6998c4
提示:出现如下表示节点已经成功加入集群中。
注意:上面命令中token默认有效时间为24小时,过期后可以在master节点执行kubeadm token create --print-join-command重新创建token
3)环境配置
$: echo "export KUBECONFIG=/etc/kubernetes/kubelet.conf" >> /etc/profile
$: source /etc/profile
3.2.3、查看节点状态
$:kubectl get node
3.2.4、问题
描述:如果执行kubectl get node命令时发现有些节点一直处于NotReady状态,在这些节点执行journalct -xefu kubelet命令则提示如下错误:
原因:故障节点没有自动生成/etc/cni/net.d/10-flannel.conflist。
方案:将正常节点上/etc/cni/net.d/10-flannel.conflist拷贝到故障节点对应目录。