基于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环境规划:
|
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下:
[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
注:每个软件包的作用
- Kubeadm: kubeadm是一个工具,用来初始化k8s集群的
- kubelet: 安装在集群所有节点上,用于启动Pod的,kubeadm安装k8s,k8s控制节点和工作节点的组件,都是基于pod运行的,只要pod启动,就需要kubelet
- 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
# 配置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
[root@starctomaster1 ~]# kubectl get pods -n kube-system -owide
五、扩容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
对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
六、安装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 网络插件 。
[root@starctomaster1 ~]# kubectl apply -f calico.yaml
[root@starctomaster1 ~]# kubectl get nodes
[root@starctomaster1 ~]# kubectl get pods -n kube-system -owide
七、测试在k8s创建pod是否可以正常访问网络
# 把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云平台推荐
随便看看
- 2021-11-26MongoDB副本集设置节点优先级priority
- 2021-07-20CI/CD Pipeline之Gitlab部署
- 2021-03-04MySQL性能瓶颈分析-大事务/执行计划
- 2023-07-04MySQL mysqldump备份之--set-gtid-purged=OFF参数影响
- 2021-04-04Linux服务器配置Google二次验证登录