前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除
一、安装要求
在开始之前,部署Kubernetes集群集群需要满足以下几个条件:
- 一台多多台机器,操作系统CentOS.x-86_x64
- 硬件配置:2GB或更多RAM,2个CPU或更多,硬盘30G以上、
- 集群中所有机器之间网络互通
- 可以访问外网,需要拉取镜像
- 禁止swap分区
二、软件环境
- CentOS 7
- Docker:20+
- k8s:1.23.6
三、安装步骤
1、准备环境
角色 | IP地址 | 组件 |
---|---|---|
k8s-master | 192.168.1.10 | docker、kubectl、kubeadm、kubelet |
k8s-node1 | 192.168.1.11 | docker、kubectl、kubeadm、kubelet |
k8s-node2 | 192.168.1.12 | docker、kubectl、kubeadm、kubelet |
2、初始操作
-
检查操作环境的版本:
[root@k8s-master ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)
-
主机名解析:
为了方便集群之间的直接调用,配置主机名解析,企业中推荐使用内部DNS服务器
# 根据规划在三台主机分别设置好主机名# hostnamectl set-hostname <hostname>[root@k8s-master ~]# vim /etc/hosts192.168.1.10 k8s-master192.168.1.11 k8s-node1192.168.1.12 k8s-node2
-
时间同步:
Kubernetes要求集群中的节点时间必须精确一致,这里使用chronyd服务从网络同步时间;企业中建议配置内部的会见同步服务器
[root@master ~]# systemctl start chronyd[root@master ~]# systemctl enable chronyd[root@master ~]# date
-
禁用iptables和firewalld服务:
Kubernetes和docker在运行中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则
# 1 关闭firewalld服务[root@master ~]# systemctl stop firewalld[root@master ~]# systemctl disable firewalld# 2 关闭iptables服务[root@master ~]# systemctl stop iptables[root@master ~]# systemctl disable iptables
-
禁用selinux:
SELinux是linux系统中的一个安全服务,如果不关闭它,它会在集群中产生各种各样的问题
# 修改SELINUX的值为disable[root@master ~]# vim /etc/selinux/config...SELINUX=disabled...# 注意:修改完后需要重启,重启完后,可使用getenforce查看[root@k8s-master ~]# getenforceDisabled---------------------------------------------------# 另一种方法:下面两条命令分别设置永久与临时关闭SELinux:[root@master ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久[root@master ~]# setenforce 0 # 临时
-
关闭swap分区:
swap分区指的是虚拟内存分区,它的作用是物理内容使用完后,之后将磁盘空间虚拟成内存来使用。启用swap设备会对系统的性能产生非常负面的影响,因此Kubernetes要求每个节点都要禁用swap设备,若因某些原因不能关闭swap分区,就要在安装过程通过明确的参数进行配置说明
# 注释掉swap分区一行[root@master ~]# vim /etc/fstab# /dev/mapper/centos-swap swap defaults 0 0-----------------------------------------------------# swapoff -a # 临时# sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
-
修改Linux的内核参数:
# 修改Linux的内核采纳数,添加网桥过滤和地址转发功能# 编辑/etc/sysctl.d/kubernetes.conf文件,添加如下:[root@master ~]# vim /etc/sysctl.d/kubernetes.confnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1net.ipv4.ip_forward=1[root@master ~]# sysctl -w net.ipv4.ip_forward=1# 重新加载配置[root@master ~]# sysctl -p# 加载网桥过滤模块[root@master ~]# modprobe br_netfilter# 查看网桥过滤模块是否加载成功[root@master ~]# lsmod | grep br_netfilter
-
配置ipvs功能:
在Kubernetes中Service有几种工作模型:一种是基于Iptables的,一种是基于ipvs的;ipvs的性能明显要高一些,但如果需要使用它,需要手动载入ipvs模块:
# 1、安装ipset和ipvsdm[root@master ~]# yum install ipset ipvsadm -y# 2、添加需要加载的模块写入脚本文件[root@master ~]# cat <<EOF> /etc/sysconfig/modules/ipvs.modules#!/bin/bashmodprobe -- ip_vsmodprobe -- ip_vs_rrmodprobe -- ip_vs_wrrmodprobe -- ip_vs_shmodprobe -- nf_conntrack_ipv4EOF# 2、为脚本添加执行权限[root@master ~]# chmod +x /etc/sysconfig/modules/ipvs.modules# 4.执行脚本文件[root@master ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules# 5.查看对应的模块是否加载成功[root@master ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
3、安装基础软件(所有节点)
-
安装Docker:
# 1、切换镜像源[root@master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo# 2、查看当前镜像源中支持的docker版本[root@master ~]# yum list docker-ce --showduplicates# 3、安装特定版本的docker-ce# 必须制定--setopt=obsoletes=0,否则yum会自动安装更高版本[root@master ~]# yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y# 4、添加一个配置文件#Docker 在默认情况下使用Vgroup Driver为cgroupfs,而Kubernetes推荐使用systemd来替代cgroupfs[root@master ~]# mkdir /etc/docker[root@master ~]# vim /etc/docker/daemon.json{"exec-opts": ["native.cgroupdriver=systemd"],"registry-mirrors": ["https://do.nark.eu.org","https://dc.j8.work","https://docker.m.daocloud.io","https://dockerproxy.com","https://docker.mirrors.ustc.edu.cn","https://docker.nju.edu.cn"]}# 5、启动dokcer并加入开机自启项中[root@master ~]# systemctl restart docker[root@master ~]# systemctl enable docker
-
添加阿里云yum源:
由于kubernetes的镜像在国外,速度比较慢,这里切换成国内的镜像源
# 1、添加k8syum配置[root@master ~]# vim /etc/yum.repod.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64enabled=1gpgchech=0repo_gpgcheck=0gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpghttp://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
-
安装Kubeadm、kubelet、kubectl:
[root@master ~]# yum install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6# 配置kubelet的cgroup[root@master ~]# vim /etc/sysconfig/kubeletKUBELET_CGROUP_ARGS="--cgroup-driver=systemd"KUBE_PROXY_MODE="ipvs"# 设置kubelet开机自启[root@master ~]# systemctl enable kubelet
4、部署Kubernetes Master
以下操作在master节点上进行:
-
准备集群镜像:
在安装kubernetes集群之前,必须要提前准备好集群需要的镜像,所需镜像可以通过下面命令查看:
[root@master ~]# kubeadm config images list# 下载镜像# 此镜像kubernetes的仓库中,由于网络原因,无法连接,下面提供了一种替换方案[root@master ~]# vim /prepare-k8s.shimages=(kube-apiserver:v1.23.6kube-controller-manager:v1.23.6kube-scheduler:v1.23.6kube-proxy:v1.23.6pause:3.2etcd:3.5.0coredns:1.8.0)for imageName in ${images[@]};dodocker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageNamedocker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageNamedocker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName done
-
集群初始化:
# 创建集群[root@master ~]# kubeadm init \--apiserver-advertise-address=192.168.1.10 \--image-repository registry.aliyuncs.com/google_containers \--kubernetes-version v1.23.6 \--service-cidr=10.96.0.0/12 \--pod-network-cidr=10.244.0.0/16# 创建必要文件[root@master ~]# mkdir -p $HOME/.kube[root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config[root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config# 出现master节点则成功[root@master ~]# kubectl get nodes
5、加入Kubernetes Node
以下操作在node节点上操作:
-
在k8s-master控制台初始化成功后复制join命令:
[root@k8s-node1 ~]# kubeadm join 192.168.113.120:6443 --token w34ha2.66if2c8nwmeat9o7 --discovery-token-ca-cert-hash sha256:20e2227554f8883811c01edd850f0cf2f396589d32b57b9984de3353a7389477
-
如果初始的token不小心清空,可通过以下命令获取或重新申请:
# token过期则重新申请[root@master ~]# kubeadm token create# token没有过期则通过如下命令获取:[root@master ~]# kubeadm token list
-
获取 --discovery-token-ca-cert-hash值:
[root@master ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \openssl dgst -sha256 -hex | sed 's/^.* //'
获取到值后需要在前面拼接上 sha256 使用;
6、部署CNI网络插件
下载 calico 配置文件,可能会网络超时:
[root@k8s-master ~]# cd ./opt[root@k8s-master opt]# mkdir k8s[root@k8s-master opt]# cd k8s/[root@k8s-master k8s]# wget https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed100 83 100 83 0 0 136 0 --:--:-- --:--:-- --:--:-- 136[root@k8s-master k8s]# lscalico.yaml
修改 calico.yaml 文件中的 CALICO_IPV4POOL_CIDR 配置,修改为与初始化的 cidr 相同:
删除镜像 docker.io/ 前缀,避免下载过慢导致失败
[root@k8s-master k8s]# grep imgae calico.yaml[root@k8s-master k8s]# sed -i 's#docker.io/##g' calico.yaml# 建议分别在三个节点中pull下所需镜像[root@k8s-master k8s]# kubectl apply -f calico.yml-----------------检查排错---------------------------# 查看节点情况[root@k8s-master k8s]# kubectl get pods -n kube-system# 查看详细信息[root@k8s-master k8s]# kubectl describe po <xxx> -n kube-system
7、测试Kubernetes集群
# 创建部署[root@k8s-master ~]# kubectl create deployment nginx --image=nginx# 暴露端口[root@k8s-master ~]# kubectl expose deployment nginx --port=80 --type=NodePort# 查看 pod 以及服务信息[root@k8s-master ~]# kubectl get pod,svcNAME READY STATUS RESTARTS AGEpod/nginx-85b98978db-4gclp 0/1 ContainerCreating 0 24sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEservice/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5h15mservice/nginx NodePort 10.101.177.187 <none> 80:32754/TCP 12s# 访问[root@k8s-master ~]# curl 192.168.1.10:32754<!DOCTYPE html><html><head><title>Welcome to nginx!</title>...
致谢
在此,我要对所有为知识共享做出贡献的个人和机构表示最深切的感谢。同时也感谢每一位花时间阅读这篇文章的读者,如果文章中有任何错误,欢迎留言指正。
学习永无止境,让我们共同进步!!