栏目头部广告

基于UCloud云主机自建K8S集群

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

1.1 集群网络规划

操作系统:centos7.9

K8S集群角色

IP

主机名

安装的组件

控制节点

192.168.20.16

starctomaster1

apiserver、controller-manager、schedule、kubelet、etcd、kube-proxy、容器运行时、calico

工作节点

192.168.20.203

starctonode1

Kube-proxy、calico、coredns、容器运行时、kubelet

工作节点

192.168.20.237

starctonode2

Kube-proxy、calico、coredns、容器运行时、kubelet

k8s环境规划:

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

1.2 关闭selinux,所有k8s机器均操作

为什么要关闭selinux?
SELinux 是 Linux 系统的一种安全机制,可以限制系统资源(如文件、网络等)的访问,提高系统的安全性。在 Kubernetes 运行过程中,需要访问系统资源,但 SELinux 可能会限制访问,从而影响 Kubernetes 的运行。因此,在安装 Kubernetes 时,需要关闭 SELinux,以避免它对 Kubernetes 的影响。

sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

注:修改selinux配置文件之后,重启linux机器,selinux配置才能永久生效,重启之后,登录到机器,执行如下命令:
getenforce
# 如果显示Disabled说明selinux已经关闭

1.3 配置机器主机名

在192.168.20.16上执行如下:
hostnamectl set-hostname starctomaster1 && bash 
在192.168.20.203上执行如下:
hostnamectl set-hostname starctonode1 && bash
在192.168.20.237上执行如下:
hostnamectl set-hostname starctonode2 && bash

1.4 配置主机hosts文件,相互之间通过主机名互相访问

修改每台机器的/etc/hosts文件,文件最后增加如下内容:
192.168.20.16 starctomaster1  
192.168.20.203 starctonode1  
192.168.20.237 starctonode2  

1.5 配置主机之间无密码登录

配置starctomaster1到其他机器免密登录
[root@starctomaster1 ~]# ssh-keygen  # 一路回车,不输入密码
把本地生成的密钥文件和私钥文件拷贝到远程主机
[root@starctomaster1 ~]# ssh-copy-id starctonode1
[root@starctomaster1 ~]# ssh-copy-id starctonode2

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

# 临时关闭
[root@starctomaster1 ~]# swapoff -a
[root@starctonode1 ~]# swapoff -a
[root@starctonode2 ~]# swapoff -a

# 永久关闭:注释swap挂载,给swap这行开头加注释
[root@starctomaster1 ~]# vim /etc/fstab   
#/dev/mapper/centos-swap swap      swap    defaults        0 0
[root@starctonode1 ~]# vim /etc/fstab
#/dev/mapper/centos-swap swap      swap    defaults        0 0
[root@starctonode2 ~]# vim /etc/fstab
#/dev/mapper/centos-swap swap      swap    defaults        0 0

1.7 修改机器内核参数 

[root@starctomaster1 ~]# modprobe br_netfilter

modprobe br_netfilter 的作用是将 br_netfilter 模块添加到 Linux 内核中。这个模块是 Linux 网桥的核心模块,它提供了网络包转发和过滤的功能。当我们使用 Kubernetes 的时候,需要使用网络插件(如 Flannel、Calico 等)来实现容器之间的网络通信,而这些网络插件通常会使用 Linux 网桥来进行数据包的转发和过滤。因此,在安装 Kubernetes 之前需要确保 br_netfilter 模块已经加载到内核中,以便 Kubernetes 能够正常使用网络插件。

[root@starctomaster1 ~]# vim /etc/sysctl.d/k8s.conf 

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1

[root@starctomaster1 ~]# sysctl -p /etc/sysctl.d/k8s.conf
# sysctl 将读取 /etc/sysctl.d/k8s.conf 文件中的参数,并将其应用到当前系统。

[root@starctonode1~]# sysctl -p /etc/sysctl.d/k8s.conf

[root@starctonode1 ~]# modprobe br_netfilter
[root@starctonode1~]# vim /etc/sysctl.d/k8s.conf 

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1

[root@ starctonode1~]# sysctl -p /etc/sysctl.d/k8s.conf

[root@starctonode2 ~]# modprobe br_netfilter
[root@starctonode2 ~]# vim /etc/sysctl.d/k8s.conf 

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1

[root@starctonode2 ~]# sysctl -p /etc/sysctl.d/k8s.conf

1.8 关闭firewalld防火墙

[root@starctomaster1 ~]# systemctl stop firewalld ; systemctl disable firewalld
[root@starctonode1 ~]# systemctl stop firewalld ; systemctl disable firewalld
[root@starctonode2 ~]# systemctl stop firewalld ; systemctl disable firewalld

1.9 配置阿里云的repo源

# 配置国内安装docker和containerd的阿里云在线源
[root@starctomaster1 ~]#yum install yum-utils -y
[root@starctonode1 ~]#yum install yum-utils -y
[root@starctonode2 ~]#yum install yum-utils -y

[root@starctomaster1 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@starctonode1 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@starctonode2 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

1.10 配置时间同步

在starctomaster1上执行如下:
# 安装ntpdate命令
[root@starctomaster1 ~]# yum install ntpdate -y
# 跟网络时间做同步
[root@starctomaster1 ~]# ntpdate 
cn.pool.ntp.org
# 把时间同步做成计划任务
[root@starctomaster1 ~]# crontab -e
* *  * * * /usr/sbin/ntpdate   
cn.pool.ntp.org
[root@starctomaster1 ~]# systemctl restart crond

注:starctomaster1、starctonode1、starctonode1节点操作相同。

1.11 安装基础软件包

# 所有节点都安装

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

二、安装containerd服务

在 Kubernetes 中,每个节点都需要运行一个容器运行时(containerd),用于管理和运行容器。就像我们在电脑上需要安装一个软件才能打开一个文件一样,在 Kubernetes 中需要安装一个容器运行时才能在pod中运行容器。

Kubernetes 中的容器运行时就像一个保姆一样,它负责管理容器的生命周期和资源隔离,确保容器能够在节点上稳定地运行。其中,containerd 就是一个常用的容器运行时,它实现了 Kubernetes 规定的 CRI 接口,因此可以被 Kubernetes 作为容器运行时来使用。简单来说,就是 Kubernetes 需要容器运行时来管理和运行容器,而 containerd 就是 Kubernetes 中常用的一种容器运行时,能够让 Kubernetes 更加高效、稳定地运行容器化应用。

在 Kubernetes 中,当一个 Pod 被创建时,Kubernetes 会根据 Pod 中定义的容器信息,将它们交给容器运行时来创建和运行。

[root@starctomaster1 ~]# yum install containerd.io-1.6.22*  -y
[root@starctomaster1 ~]#cd /etc/containerd
[root@starctomaster1 containerd ~]# rm -rf *   
# 清空文件后,上传config.toml文件到/etc/containerd下:

基于UCloud云主机自建K8S集群(pic1)config.toml.zip

[root@starctomaster1 containerd ~]# systemctl start containerd && systemctl enable containerd

注:starctomaster1、starctonode1、starctonode1节点操作相同。

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

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

[root@starctomaster1 ~]#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

[root@starctomaster1 ~]# yum clean all && yum makecache

[root@starctonode1 ~]#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
[root@starctonode1 ~]# yum clean all && yum makecache

[root@starctonode2 ~]#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

[root@starctonode2 ~]# yum clean all && yum makecache

其中baseurl是指定仓库的URL地址。在这个例子中,这个仓库是Kubernetes针对x86_64架构的yum仓库,也就是说,当你使用yum安装Kubernetes时,yum会从这个指定的URL地址获取Kubernetes的安装包和依赖包,从而进行安装。使用阿里云镜像站可以提高安装速度和稳定性。

[root@starctomaster1 ~]# yum install -y kubelet-1.26.0 kubeadm-1.26.0 kubectl-1.26.0
[root@starctomaster1 ~]# systemctl enable kubelet

[root@starctonode1 ~]# yum install -y kubelet-1.26.0 kubeadm-1.26.0 kubectl-1.26.0
[root@starctonode1 ~]# systemctl enable kubelet

[root@starctonode2 ~]# yum install -y kubelet-1.26.0 kubeadm-1.26.0 kubectl-1.26.0
[root@starctonode2 ~]# systemctl enable kubelet

注:每个软件包的作用

  1. Kubeadm:  kubeadm是一个工具,用来初始化k8s集群的
  2. kubelet:   安装在集群所有节点上,用于启动Pod的,kubeadm安装k8s,k8s控制节点和工作节点的组件,都是基于pod运行的,只要pod启动,就需要kubelet
  3. kubectl:   通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件

四、kubeadm初始化k8s集群

# 使用kubeadm初始化k8s集群
[root@starctomaster1 ~]# kubeadm config print init-defaults > kubeadm.yaml

根据我们自己的需求修改配置,比如修改 imageRepository 的值,kube-proxy 的模式为 ipvs,需要注意的是由于我们使用的containerd作为运行时,所以在初始化节点的时候需要指定cgroupDriver为systemd

kubeadm.yaml配置文件如下:

apiVersion: kubeadm.k8s.io/v1beta3
...
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.20.16 # 控制节点的ip
  bindPort: 6443
nodeRegistration:
  criSocket: 
unix:///run/containerd/containerd.sock  # 指定containerd容器运行时
  imagePullPolicy: IfNotPresent
  name:  starctomaster1 # 控制节点主机名
  taints: null
---
apiVersion: 
kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: 
registry.cn-hangzhou.aliyuncs.com/google_containers
# 指定阿里云镜像仓库地址
kind: ClusterConfiguration
kubernetesVersion: 1.26.0 # k8s版本
networking:
  dnsDomain: cluster.local
  podSubnet: 10.244.0.0/16   # 指定pod网段, 需要新增加这个
  serviceSubnet: 10.96.0.0/12 # 指定Service网段
scheduler: {}
# 在文件最后,插入以下内容,(复制时,要带着---):
---
apiVersion: 
kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---
apiVersion: 
kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd

# 基于kubeadm.yaml初始化k8s集群
[root@starctomaster1 ~]# ctr -n=k8s.io images import k8s_1.26.0.tar.gz
[root@starctonode1 ~]# ctr -n=k8s.io images import k8s_1.26.0.tar.gz
[root@starctonode2 ~]# ctr -n=k8s.io images import k8s_1.26.0.tar.gz

[root@starctomaster1 ~]# ctr -n=k8s.io images ls  # 查看镜像列表

[root@starctomaster1 ~]# kubeadm init --config=kubeadm.yaml --ignore-preflight-errors=SystemVerification 

image.png

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

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

[root@starctomaster1 ~]# kubectl get nodes

image.png

[root@starctomaster1 ~]# kubectl get pods -n kube-system -owide

image.png

五、扩容k8s集群-添加node节点

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

[root@starctomaster1 ~]# kubeadm token create --print-join-command

kubeadm join 192.168.20.16:6443 --token u95n31.uwiana39y0dz7j0m --discovery-token-ca-cert-hash sha256:f990a7d95bee9f64af9fb13a20cadfd38b45aac05cf1d79535bae57ba211c23a

把starctonode1加入k8s集群:
[root@starctonode1~]#
kubeadm join 192.168.20.16:6443 --token u95n31.uwiana39y0dz7j0m --discovery-token-ca-cert-hash sha256:f990a7d95bee9f64af9fb13a20cadfd38b45aac05cf1d79535bae57ba211c23a  --ignore-preflight-errors=SystemVerification

把starctonode2加入k8s集群:
[root@starctonode1~]# 
kubeadm join 192.168.20.16:6443 --token u95n31.uwiana39y0dz7j0m --discovery-token-ca-cert-hash sha256:f990a7d95bee9f64af9fb13a20cadfd38b45aac05cf1d79535bae57ba211c23a  --ignore-preflight-errors=SystemVerification

image.png

对starctonode1和starctonode2打个标签,显示work

[root@starctomaster1 ~]# kubectl label nodes starctonode1 node-role.kubernetes.io/work=work
[root@starctomaster1 ~]# kubectl label nodes starctonode2 node-role.kubernetes.io/work=work
[root@starctomaster1 ~]# kubectl get nodes

image.png

六、安装kubernetes网络组件-Calico

把安装calico需要的镜像calico.tar.gz传到starctomaster1和starctonode1、starctonode2节点,手动解压:
[root@starctomaster1 ~]# ctr -n=
k8s.io images import calico.tar.gz
[root@starctonode1 ~]# ctr -n=
k8s.io images import calico.tar.gz
[root@starctonode2~]# ctr -n=
k8s.io images import calico.tar.gz

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

基于UCloud云主机自建K8S集群(pic7)calico.zip

[root@starctomaster1 ~]# kubectl apply -f  calico.yaml

[root@starctomaster1 ~]# kubectl get nodes

image.png

[root@starctomaster1 ~]# kubectl get pods -n kube-system -owide

image.png

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

基于UCloud云主机自建K8S集群(pic10)busybox.zip

# 把busybox-1-28.tar.gz上传到starctonode1和starctonode2节点,手动解压
[root@starctonode1 ~]# ctr -n 
k8s.io images import busybox-1-28.tar.gz
[root@starctonode2 ~]# ctr -n 
k8s.io images import busybox-1-28.tar.gz

[root@starctomaster1 ~]# kubectl run busybox --image docker.io/library/busybox:1.28  --image-pull-policy=IfNotPresent --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

/ # 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网络插件已经被正常安装了

/ # exit #退出pod

10.96.0.10 就是我们coreDNS的clusterIP,说明coreDNS配置好了。
解析内部Service的名称,是通过coreDNS去解析的。

注意:busybox要用指定的1.28版本,不能用最新版本,最新版本,nslookup会解析不到dns和ip 

作者:UStarGao
链接:https://www.starcto.com/k8s/327.html
来源:STARCTO
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处

UCloud云平台推荐


UCloud新用户专属注册连接

UCloud CDN超值特惠专场

UCloud全球云主机(UHost/VPS)大促页面

UCloud快杰云主机大促页面

文章页广告

随便看看

栏目底部广告
`