Kubernetes集群安装步骤

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除

一、安装要求

在开始之前,部署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/hosts
 192.168.1.10 k8s-master
 192.168.1.11 k8s-node1
 192.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 ~]# getenforce
 Disabled
 ---------------------------------------------------
 # 另一种方法:下面两条命令分别设置永久与临时关闭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.conf
 net.bridge.bridge-nf-call-ip6tables = 1
 net.bridge.bridge-nf-call-iptables = 1
 net.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/bash
 modprobe -- ip_vs
 modprobe -- ip_vs_rr
 modprobe -- ip_vs_wrr
 modprobe -- ip_vs_sh
 modprobe -- nf_conntrack_ipv4
 EOF
 # 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=Kubernetes
 baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
 enabled=1
 gpgchech=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
  • 安装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/kubelet
 KUBELET_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.sh
 images=(
     kube-apiserver:v1.23.6
     kube-controller-manager:v1.23.6
     kube-scheduler:v1.23.6
     kube-proxy:v1.23.6
     pause:3.2
     etcd:3.5.0
     coredns:1.8.0
 )
 ​
 for imageName in ${images[@]};do
     docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
     docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
     docker 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]# curl https://docs.projectcalico.org/manifests/calico.yaml -O
   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                  Dload  Upload   Total   Spent    Left  Speed
 100    83  100    83    0     0    136      0 --:--:-- --:--:-- --:--:--   136
 [root@k8s-master k8s]# ls
 calico.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,svc
 NAME                         READY   STATUS              RESTARTS   AGE
 pod/nginx-85b98978db-4gclp   0/1     ContainerCreating   0          24s
 ​
 NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
 service/kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        5h15m
 service/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>
 ...

致谢

在此,我要对所有为知识共享做出贡献的个人和机构表示最深切的感谢。同时也感谢每一位花时间阅读这篇文章的读者,如果文章中有任何错误,欢迎留言指正。 

学习永无止境,让我们共同进步!!

相关推荐

  1. centos搭建kubernetes步骤

    2024-07-20 12:12:03       52 阅读
  2. Kind 安装 kubernets

    2024-07-20 12:12:03       68 阅读
  3. 单机Kubenetes——KinD安装

    2024-07-20 12:12:03       53 阅读
  4. Kubernetes部署

    2024-07-20 12:12:03       41 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-20 12:12:03       172 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-20 12:12:03       190 阅读
  3. 在Django里面运行非项目文件

    2024-07-20 12:12:03       158 阅读
  4. Python语言-面向对象

    2024-07-20 12:12:03       171 阅读

热门阅读

  1. 第六章 Spring框架深入学习(2023版本IDEA)

    2024-07-20 12:12:03       34 阅读
  2. IO文件流

    2024-07-20 12:12:03       34 阅读
  3. 游戏外挂的技术实现与五年脚本开发经验分享

    2024-07-20 12:12:03       32 阅读
  4. mysql高阶知识梳理

    2024-07-20 12:12:03       32 阅读
  5. 3.设计模式--创建者模式--工厂模式

    2024-07-20 12:12:03       28 阅读
  6. npm下载的依赖包版本号怎么看

    2024-07-20 12:12:03       33 阅读
  7. 【AI工具基础】—Kylin(一)

    2024-07-20 12:12:03       30 阅读
  8. Unity3D 如何读取策划给定的Excel表格详解

    2024-07-20 12:12:03       35 阅读
  9. PHP学习笔记③

    2024-07-20 12:12:03       27 阅读