学习K8S时,常常需要自己搭建环境,本人将centOS-7上搭建K8S的过程进行做如下的记录,以方便自己后续环境的搭建和指导其他人搭建环境作为参考资料,本章节主要介绍如何搭建kubernetes的集群环境

集群环境搭建

集群类型

kubernetes集群大体上分为两类:一主多从多主多从

  • 一主多从:一台Master节点和多台Node节点,搭建简单,但是有单机故障风险,适合用于测试环境
  • 多主多从:多台Master节点和多台Node节点,搭建麻烦,安全性高,适合用于生产环境

说明:为了测试简单,本次搭建的是 一主两从 类型的集群

安装方式

kubernetes有多种部署方式,目前主流的方式有kubeadm、minikube、二进制包

  • minikube:一个用于快速搭建单节点kubernetes的工具
  • kubeadm:一个用于快速搭建kubernetes集群的工具
  • 二进制包 :从官网下载每个组件的二进制包,依次去安装,此方式对于理解kubernetes组件更加有效

说明:现在需要安装kubernetes的集群环境,但是又不想过于麻烦,所以选择使用kubeadm方式

主机规划

作用

IP地址

操作系统

配置

Master

192.168.1.100

Centos7.9 基础设施服务器

2颗CPU 2G内存 50G硬盘

Node1

192.168.1.101

Centos7.9 基础设施服务器

2颗CPU 2G内存 50G硬盘

Node2

192.168.1.102

Centos7.9 基础设施服务器

2颗CPU 2G内存 50G硬盘

Node3

192.168.1.103

Centos7.9 基础设施服务器

2颗CPU 2G内存 50G硬盘

环境搭建

本次环境搭建需要安装三台Centos服务器(一主二从),然后在每台服务器中分别安装docker(18.06.3),kubeadm(1.17.4)、kubelet(1.17.4)、kubectl(1.17.4)程序。

主机安装

安装虚拟机过程中注意下面选项的设置:

  • 操作系统环境:CPU(2C) 内存(2G) 硬盘(50G)
  • 语言选择:中文简体
  • 软件选择:基础设施服务器
  • 分区选择:自动分区
  • 网络配置:按照下面配置网路地址信息
网络地址:192.168.1.100  (每台主机都不一样  分别为100、101、102,103)
子网掩码:255.255.255.0
默认网关:192.168.1.99
DNS:114.114.114.114
  • 主机名设置:按照下面信息设置主机名
  • master节点: master
    node节点: node1
    node节点: node2
    node节点: node3
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wiWbiM7X-1650165608530)(assets/image-20200505214156148.png)]

环境初始化

  1. 检查操作系统的版本

#此方式下安装kubernetes集群要求Centos版本要在7.5或之上(否则存在node节点无法加入master的情况)

k3s集群上如何安装python k8s集群安装 centos7 简书_docker

2) 主机名解析

为了方便后面集群节点间的直接调用,在这配置一下主机名解析,企业中推荐使用内部DNS服务器

# 主机名成解析 编辑三台服务器的/etc/hosts文件,添加下面内容
192.168.1.100  master
192.168.1.101  node1
192.168.1.102  node2
192.168.1.103  node3

修改系统的DNS(不然在拉取镜像中存在报错):

vim /etc/resolv.conf

内容改为:

#Generated by NetworkManager

search localdomain

nameserver 114.114.114.114

k3s集群上如何安装python k8s集群安装 centos7 简书_k3s集群上如何安装python_02

3) 时间同步

kubernetes要求集群中的节点时间必须精确一致,这里直接使用chronyd服务从网络同步时间。

企业中建议配置内部的时间同步服务器

# 启动chronyd服务
[root@master ~]# systemctl start chronyd
# 设置chronyd服务开机自启
[root@master ~]# systemctl enable chronyd
# chronyd服务启动稍等几秒钟,就可以使用date命令验证时间了
[root@master ~]# date

k3s集群上如何安装python k8s集群安装 centos7 简书_linux_03

4) 禁用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

k3s集群上如何安装python k8s集群安装 centos7 简书_kubernetes_04

5) 禁用selinux

selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题

# 编辑 /etc/selinux/config 文件,修改SELINUX的值为disabled
# 注意修改完毕之后需要重启linux服务
SELINUX=disabled

k3s集群上如何安装python k8s集群安装 centos7 简书_kubernetes_05

6) 禁用swap分区

swap分区指的是虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间虚拟成内存来使用

启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备

但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明

# 编辑分区配置文件/etc/fstab,注释掉swap分区一行
# 注意修改完毕之后需要重启linux服务
 UUID=455cc753-7a60-4c17-a424-7741728c44a1 /boot    xfs     defaults        0 0
 /dev/mapper/centos-home /home                      xfs     defaults        0 0
# /dev/mapper/centos-swap swap                      swap    defaults        0 0

k3s集群上如何安装python k8s集群安装 centos7 简书_kubernetes_06

7)修改linux的内核参数

# 修改linux的内核参数,添加网桥过滤和地址转发功能
# 编辑/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 -p

# 加载网桥过滤模块
[root@master ~]# modprobe br_netfilter

# 查看网桥过滤模块是否加载成功
[root@master ~]# lsmod | grep br_netfilter

k3s集群上如何安装python k8s集群安装 centos7 简书_云原生_07

8)配置ipvs功能

在kubernetes中service有两种代理模型,一种是基于iptables的,一种是基于ipvs的

两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块

#1 安装ipset和ipvsadm

[root@master ~]# yum install ipset ipvsadmin -y

k3s集群上如何安装python k8s集群安装 centos7 简书_云原生_08


k3s集群上如何安装python k8s集群安装 centos7 简书_linux_09

#2 添加需要加载的模块写入脚本文件

[root@master ~]# cat < /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

k3s集群上如何安装python k8s集群安装 centos7 简书_云原生_10

#3 为脚本文件添加执行权限
[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

k3s集群上如何安装python k8s集群安装 centos7 简书_kubernetes_11

9) 重启服务器

上面步骤完成之后,需要重新启动linux系统

[root@master ~]# reboot

安装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在默认情况下使用的Cgroup Driver为cgroupfs,而kubernetes推荐使用systemd来代替cgroupfs
[root@master ~]# mkdir /etc/docker
[root@master ~]# cat <<EOF >  /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"]
}
EOF

# 5 启动docker
[root@master ~]# systemctl restart docker
[root@master ~]# systemctl enable docker

# 6 检查docker状态和版本
[root@master ~]# docker version

k3s集群上如何安装python k8s集群安装 centos7 简书_linux_12

安装kubernetes组件

# 由于kubernetes的镜像源在国外,速度比较慢,这里切换成国内的镜像源
# 编辑/etc/yum.repos.d/kubernetes.repo,添加下面的配置 
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=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 --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y

# 配置kubelet的cgroup
# 编辑/etc/sysconfig/kubelet,添加下面的配置
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"

# 4 设置kubelet开机自启
[root@master ~]# systemctl enable kubelet

k3s集群上如何安装python k8s集群安装 centos7 简书_kubernetes_13


k3s集群上如何安装python k8s集群安装 centos7 简书_docker_14


修改配置文件如下

k3s集群上如何安装python k8s集群安装 centos7 简书_linux_15

准备集群镜像

在安装kubernetes集群之前,必须要提前准备好集群需要的镜像,所需镜像可以通过下面命令查看

[root@master ~]# kubeadm config images list

k3s集群上如何安装python k8s集群安装 centos7 简书_kubernetes_16


下载镜像

此镜像在kubernetes的仓库中,由于网络原因,无法连接,下面提供了一种替代方案

images=(

kube-apiserver:v1.17.4

kube-controller-manager:v1.17.4

kube-scheduler:v1.17.4

kube-proxy:v1.17.4

pause:3.1

etcd:3.4.3-0

coredns:1.6.5

)

k3s集群上如何安装python k8s集群安装 centos7 简书_linux_17


for imageName in k3s集群上如何安装python k8s集群安装 centos7 简书_linux_18imageName

docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/k3s集群上如何安装python k8s集群安装 centos7 简书_linux_19imageName

docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName

done

k3s集群上如何安装python k8s集群安装 centos7 简书_云原生_20


单个组件的操作可以用下面这个方法:

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.17.4
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.17.4 k8s.gcr.io/kube-apiserver:v1.17.4
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.17.4

集群初始化

下面开始对集群进行初始化,并将node节点加入到集群中

下面的操作只需要在master节点上执行即可

#创建集群

[root@master ~]# kubeadm init

–kubernetes-version=v1.17.4

–pod-network-cidr=10.244.0.0/16

–service-cidr=10.96.0.0/12

–apiserver-advertise-address=192.168.1.100 (master的IP地址,需要修改)

k3s集群上如何安装python k8s集群安装 centos7 简书_linux_21


得到的结果如下:

k3s集群上如何安装python k8s集群安装 centos7 简书_云原生_22

#创建必要文件

[root@master ~]# mkdir -p $HOME/.kube

[root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

[root@master ~]# sudo chown k3s集群上如何安装python k8s集群安装 centos7 简书_k3s集群上如何安装python_23(id -g) $HOME/.kube/config

k3s集群上如何安装python k8s集群安装 centos7 简书_docker_24

下面的操作只需要在node节点上执行即可

#将node节点加入集群(每个master的节点的操作不一致)

[root@master ~]# kubeadm join 192.168.109.100:6443 \

–token 8507uc.o0knircuri8etnw2

–discovery-token-ca-cert-hash

sha256:acc37967fb5b0acf39d7598f8a439cc7dc88f439a3f4d0c9cae88e7901b9d3f

需要加入到master节点上的node节点都需要执行以下的操作:

k3s集群上如何安装python k8s集群安装 centos7 简书_docker_25

#查看集群状态 此时的集群状态为NotReady,这是因为还没有配置网络插件

k3s集群上如何安装python k8s集群安装 centos7 简书_linux_26

安装网络插件

kubernetes支持多种网络插件,比如flannel、calico、canal等等,任选一种使用即可,本次选择flannel

下面操作依旧只在master节点执行即可,插件使用的是DaemonSet的控制器,它会在每个节点上都运行

#获取fannel的配置文件
[root@master ~]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

#修改文件中quay.io仓库为quay-mirror.qiniu.com

#使用配置文件启动fannel

[root@master ~]# kubectl apply -f kube-flannel.yml

k3s集群上如何安装python k8s集群安装 centos7 简书_云原生_27


#稍等片刻,再次查看集群节点的状态

[root@master ~]# kubectl get nodes

以下是过程变化

k3s集群上如何安装python k8s集群安装 centos7 简书_docker_28


结果显示如下:

k3s集群上如何安装python k8s集群安装 centos7 简书_云原生_29

至此,kubernetes的集群环境搭建完成

部署Nginx进行测试:

[root@master ~]# kubectl get nodes
NAME     STATUS     ROLES    AGE    VERSION
master   Ready      master   120m   v1.17.4
node1    Ready      <none>   115m   v1.17.4
node2    Ready      <none>   113m   v1.17.4
node3    NotReady   <none>   112m   v1.17.4
[root@master ~]# kubectl create deployment nginx --image=nginx:1.14-alpine
deployment.apps/nginx created
[root@master ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-6867cdf567-5rbrj   1/1     Running   0          26s
[root@master ~]# kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposed
[root@master ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-6867cdf567-5rbrj   1/1     Running   0          118s

k3s集群上如何安装python k8s集群安装 centos7 简书_linux_30

[root@master ~]# kubectl get service 查看Nginx暴露的端口号
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        125m
nginx        NodePort    10.110.254.217   <none>        80:**30427**/TCP   69s  查看Nginx暴露的端口号

在浏览器通过master的IP+PORT(http://192.168.1.100:30427/)的端口,进行访问nginx

k3s集群上如何安装python k8s集群安装 centos7 简书_k3s集群上如何安装python_31