K8S单Master集群安装(Docker)

发布时间 2023-05-27 19:02:41作者: 飞翔的小胖猪

文章基于CentOS 7.8系统使用docker作为容器运行时通过kubeadm指导搭建k8s单机master集群,使用calico作为k8s集群的网络插件。

需要服务器可以联网。

环境

节点说明

主机名 IP地址 操作系统
master01.lvan 192.168.100.101 CentOS Linux release 7.8
node01.lvan 192.168.100.102 CentOS Linux release 7.8
node02.lvan 192.168.100.103 CentOS Linux release 7.8

软件环境

软件名 软件版本 作用
CentOS Linux release 7.8 操作系统
docker-ce 20.10.22 容器运行时
metrics-server v0.6.2 k8s集群性能监控插件
kubectl 1.23.2-0 k8s控制工具
kubeadm 1.23.2-0 k8s服务端
kubelet 1.23.2-0 k8s客户端
calico v3.24.5 K8S网络插件
表 1 软件环境

ip地址规划

ip地址 作用
192.168.100.100 k8s主节点
192.168.100.101 k8s子节点1
192.168.100.102 k8s子节点2
10.244.0.0/16 Pod网段地址
表 2 ip地址规划

步骤预览

  1. 操作系统配置:配置IP地址、配置主机名、关闭防火墙、关闭selinux、关闭swap、修改/etc/hosts文件、配置yum源
  2. 安装配置docker
  3. 修改系统内核参数
  4. 安装kubelet软件
  5. 初始化K8S集群
  6. 子节点加入k8s集群
  7. 安装网络插件

操作过程

一、操作系统配置

该章节的所有操作所有节点上均要执行。

设置主机名

按照规划文件中的名称依次设置每个节点的主机名。

# hostnamectl set-hostname   规划的主机名

IP地址配置

按照规划文件中的IP地址依次配置每个节点的IP地址。

# systemctl stop NetworkManager;systemctl disabled NetworkManager;systemctl mask NetworkManager
# cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-修改为你的网卡名
TYPE=Ethernet
BOOTPROTO=none
NAME=修改为你的网卡名
DEVICE=修改为你的网卡名
ONBOOT=yes
IPADDR=修改为你需要设置的ip地址
NETMASK=255.255.255.0
GATEWAY=修改为你需要设置的ip地址网关
DNS1=修改为你需要设置的ip地址DNS
EOF
# systemctl restart network
# ip a

关闭selinux

在/etc/selinux/config中设置SELINUX=为disabled

# sed  -i 's/SELINUX=.*/SELINUX=disabled/g'  /etc/selinux/config
# setenforce  0

关闭swap

在/etc/fstab文件中删除swap的挂载信息行,系统中执行swaoff -a临时关闭swap。

# swapoff  -a
# sed -i '/swap/d'  /etc/fstab

关闭防火墙

关闭防火墙,并设置防火墙为开机不启动

# systemctl stop firewalld;systemctl disable firewalld;systemctl mask firewalld
# systemctl status firewalld 

设置/etc/hosts文件

在/etc/hosts文件中添加所有节点的信息。

# cat >> /etc/hosts <<EOF
192.168.100.100 master01.lvan  master01
192.168.100.101 node01.lvan    node01
192.168.100.102 node02.lvan    node02
EOF

配置yum源

备份当前的yun配置文件,并创建新的yum源文件。

# mkdir -p /etc/yum.repos.d/bak/
# mv /etc/yum.repos.d/CentOS* /etc/yum.repos.d/bak/
# 在/etc/yum.repos.d/目录中创建k8s.repo、epel.repo、docker.repo、CentOS-Base.repo 四个repo源文件,具体内容如下所示。
# yum clean all
# yum repolist 

k8s.repo

[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
View Code

epel.repo

[epel]
name=Extra Packages for Enterprise Linux 7 – $basearch
baseurl=http://mirrors.aliyun.com/epel/7/$basearch
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
View Code

docker.repo

[docker-ce-stable]
name=Docker CE Stable – $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
View Code

CentOS-Base.repo

[base]
name=CentOS-$releasever – Base – mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

#released updates
[updates]
name=CentOS-$releasever – Updates – mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/updates/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

#additional packages that may be useful
[extras]
name=CentOS-$releasever – Extras – mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/$releasever/extras/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
View Code

安装常用工具

安装vim、net-tools、bash-completion、wget常用的工具软件。

# yum install vim net-tools bash-completion  wget -y 
# source  /etc/profile.d/bash_completion.sh
# echo 'set paste'  >> ~/.vimrc

二、安装配置docker

该章节的所有操作所有节点上均要执行。

安装docker

# yum install  docker-ce-20.10.22  -y
# systemctl restart docker;systemctl enable docker

设置docker镜像加速和cgroup驱动

# cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://sdmy9bft.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
# systemctl daemon-reload;systemctl restart docker

三、修改系统内核配置

该章节的所有操作所有节点上均要执行。

# cat <<EOF > /etc/sysctl.d/k8s.conf
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

四、安装kubelet软件

该章节的所有操作所有节点上均要执行。

# yum install -y kubelet-1.23.2-0 kubeadm-1.23.2-0 kubectl-1.23.2-0 --disableexcludes=kubernetes
# systemctl restart kubelet ; systemctl enable kubelet

五、初始化K8S集群

初始化k8s环境

该操作只在master节点上执行。命令执行完成过后记录下结果。

# kubeadm init --apiserver-advertise-address=192.168.100.100 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.23.2 --pod-network-cidr=10.244.0.0/16
环境初始完成过后根据提示执行命令

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

命令执行完成过后会有如下输出,最好复制出来保存。

To start using your cluster, you need to run the following as a regular user:

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

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.100.100:6443 --token ucgmyb.0prubsd9i70e8xj2 \
        --discovery-token-ca-cert-hash sha256:b9fe9a3b75110c19be94e50534b9fb16ef068a1f9be8ca60e1407d73bc1098bb

配置kubectl命令自动补齐

该操作所有节点上均要执行。

# echo 'source <(kubectl completion bash)' >>  /etc/profile
# source /etc/profile

六、子节点加入k8s集群

获取加入集群的命令

该操作只在master节点上执行。

master节点环境初始化过后会自动生成一个命令。使用这个命令直接复制到子节点上实现子节点加入集群。

如果忘记了使用命令如下获取。

 # kubeadm token create --print-join-command

加入集群

该操作只在子节点上执行。

通过之前记录的命令或者上一步获取的命令,在子节点中复制执行。

# kubeadm join 192.168.100.100:6443 --token ucgmyb.0prubsd9i70e8xj2  --discovery-token-ca-cert-hash sha256:b9fe9a3b75110c19be94e50534b9fb16ef068a1f9be8ca60e1407d73bc1098bb

七、安装网络插件calico

该章节操作只在master节点上执行。

下载calico配置文件

执行wget命令下载calico的yaml文件。

# wget https://docs.projectcalico.org/manifests/calico.yaml --no-check-certificate

修改calico配置文件

把calico.yaml文件中的CALICO_IPV4POOL_CIDR行和其下一行前的#删除掉,并CALICO_IPV4POOL_CIDR其下行的IP地址段改为规划文件中的网段。并在calico.yaml文件中增加蓝色字体内容,指定ens33为通信网卡(多网卡环境中必须要使用,请根据自己实际情况选择正确的网卡),格式要和CALICO_IPV4POOL_CIDR对齐。

# vim calico.yaml
 - name: CALICO_IPV4POOL_CIDR
   value: "10.244.0.0/16"
- name: IP_AUTODETECTION_METHOD
   value: "interface=ens33"

下载caclio所需镜像(可选)

该操作只在master节点上执行。

手动下载calico所需镜像并上传到所有节点中,执行了kubectl apply -f calico.yaml命令后系统会自东下载,但是会有点慢。我们可以提前下载好传到所有节点中。

# grep image calico.yaml  | grep -i calico | awk -F'/' '{print $2"/"$3 }' | uniq
# docker pull  calico/cni:v3.24.5
# docker pull  calico/node:v3.24.5
# docker pull  calico/kube-controllers:v3.24.5
# docker save -o calico_image_3_24_5.tar.gz   calico/cni:v3.24.5   calico/node:v3.24.5  calico/kube-controllers:v3.24.5
# scp calico_image_3_24_5.tar.gz  root@node01:/root/
# scp calico_image_3_24_5.tar.gz  root@node02:/root/

该操作所有节点上均要执行。

加载docker镜像到系统中。

# docker load -i /root/calico_image_3_24_5.tar.gz

安装calico插件

# kubectl apply -f calico.yaml
# kubectl get nodes -o wide
# kubectl get pod -o wide -A
图 1-1 最终结果

八、安装metrics-server

metrics-server可用于k8s集群资源使用监控。

访问网址:https://github.com/kubernetes-sigs/metrics-server 在页面中下拉找到 Installation 章节,找到如下的信息: kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml ,截取蓝色高亮部分内容,在Master节点上执行命令下载conponents.yaml文件。

下载metrics-server软件

# wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.6.1/components.yaml
# #查看components.yaml所需要镜像及版本,提前下载
# grep  image components.yaml
        image: k8s.gcr.io/metrics-server/metrics-server:v0.6.2
        imagePullPolicy: IfNotPresent
# #该k8s.gcr.io/metrics-server/metrics-server:v0.6.2镜像由于不可描述的原因下载起来有点麻烦。在https://hub.docker.com/中去下载。
# docker pull k8simage/metrics-server:v0.6.2
# docker tag  k8simage/metrics-server:v0.6.2   k8s.gcr.io/metrics-server/metrics-server:v0.6.2
# #把metrics-server镜像打包并复制到所有节点上去。
# docker save -o metrics-server.tar.gz   k8s.gcr.io/metrics-server/metrics-server:v0.6.2
# scp metrics-server.tar.gz  root@x.x.x.x:/root/
# #在其他节点上读取加载metrics-server镜像包。
# docker load -i metrics-server.tar.gz
# #确认镜像包导入正常。
# docker images

修改metrics-server.yaml文件

在下载metrics-server的配置文件中修改添加蓝色字体内容。

# sed  -i -e  's/kubelet-preferred-address-types.*/kubelet-preferred-address-types=InternalIP/g' -e 's/metric-resolution.*/metric-resolution=30s/g'  -e '/metric-resolution/a\        - --kubelet-insecure-tls' components.yaml

创建metrics-server pod

执行命令创建pod,并确认metrics-server pod运行正常,可以正常获取到k8s资源性能数据。

# kubectl apply -f components.yaml
# kubectl get pods -A
# kubectl top nodes