K8s 安装部署

时间:2022-07-23
本文章向大家介绍K8s 安装部署,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

k8s为什么叫k8s呢? 因为k8s是Kubernetes的简称,因为K和S之间有8个字母,所以才会被称为k8s。 k8s最初是在Google公司内部使用了10多年的技术,它的前身是叫做Borg(博格),直到2015年才被Google公司捐赠为开源项目。

如果之前我们有接触过OpenStack,那么应该知道管理VM虚拟机资源可以用OpenStack。那么管理容器所对应的开源平台是什么呢?k8s就是其中之一,在k8s之前也有很多容器管理平台,有docker自身的docker swarm,也有apache推出的Mesos等等。相比较而言,虽然k8s比其他推出的晚了些,但是丝毫不影响其火爆程度,除了其功能强大外,更何况它还有个好爹。

关于k8s详细介绍可参考k8s中文文档

一、环境准备

主机名

IP

角色

基于服务

docker-k8s01

192.168.171.151

master

docker

docker-k8s02

192.168.171.150

node01

docker

docker-k8s03

192.168.171.152

node02

docker

注:上述三台centos 7.3服务器,均运行docker服务,如果是测试环境,那么内存最少2G,CPU至少双核,并且docker服务的版本不建议过高,最好是18.09及以下 . 部署docker服务可参考:部署 Docker

二、部署前准备工作 1、检查docker版本、关闭防火墙及Selinux、清空iptables规则、禁用Swap交换分区

注:以下操作需要在三台docker主机上分别配置一次,哪怕是在生产环境,都需要进行以下操作,因为k8s有它自己的安全策略

#查看当前docker版本
[root@docker-k8s01 ~]# docker -v
Docker version 18.09.0, build 4d60db4
#关闭防火墙
[root@docker-k8s01 ~]# systemctl stop firewalld
[root@docker-k8s01 ~]# systemctl disable firewalld
#禁用selinux
[root@docker-k8s01 ~]# setenforce 0
setenforce: SELinux is disabled
[root@docker-k8s01 ~]# vim /etc/sysconfig/selinux 
SELINUX=disabled           # 修改为disabled
#清空iptables规则
[root@docker-k8s01 ~]# iptables -F
#重启docker服务
[root@docker-k8s01 ~]# systemctl daemon-reload 
[root@docker-k8s01 ~]# systemctl restart docker 
#禁用swap交换分区
[root@docker-k8s01 ~]# swapoff -a           # 临时禁用交换分区
[root@docker-k8s01 ~]# vim /etc/fstab         # 编辑自动挂载的配置文件,将swap配置项注释掉
#/dev/mapper/cl-swap     swap                    swap    defaults        0 0
[root@docker-k8s01 ~]# mount -a            # 重新加载配置文件
[root@docker-k8s01 ~]# free -h          # 查看分区信息,确定swap行都为0
              total        used        free      shared  buff/cache   available
Mem:           1.8G        469M        841M         18M        508M        1.2G
Swap:            0B          0B          0B

2、配置ssh免密登录、主机名解析及yum源 在master主机上操作即可,配置文件可直接复制到两台node

#配置ssh免密登录(为了方便在主机间复制配置文件,可忽略)
[root@docker-k8s01 ~]# ssh-keygen -t rsa
[root@docker-k8s01 ~]# ssh-copy-id docker-k8s02
[root@docker-k8s01 ~]# ssh-copy-id docker-k8s03
#配置域名解析
[root@docker-k8s01 ~]# tail -3 /etc/hosts
192.168.171.151 docker-k8s01
192.168.171.150 docker-k8s02
192.168.171.152 docker-k8s03
#将更改后的hosts文件发送到node01及node02
[root@docker-k8s01 ~]# scp /etc/hosts docker-k8s02:/etc/
[root@docker-k8s01 ~]# scp /etc/hosts docker-k8s03:/etc/
#配置k8s yum源,这里配置的阿里云的源,可上官网自行查看
[root@docker-k8s01 ~]# cat /etc/yum.repos.d/kubernetes.repo 
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
#查看刚刚配置的yum源中有没有可用的包
[root@docker-k8s01 ~]# yum repolist 
Loaded plugins: fastestmirror, langpacks
kubernetes                                     Kubernetes                                           551                # 返回的这一行不可为0
[root@docker-k8s01 ~]# yum makecache           # 制作yum源缓存
#将yum源的配置文件复制到另外两台节点主机上
[root@docker-k8s01 ~]# scp /etc/yum.repos.d/kubernetes.repo docker-k8s02:/etc/yum.repos.d/
[root@docker-k8s01 ~]# scp /etc/yum.repos.d/kubernetes.repo docker-k8s03:/etc/yum.repos.d/
#在另外两台主机上,都需执行以下两条命令
[root@docker-k8s02 ~]# yum repolist 
kubernetes                                     Kubernetes                                           551          # 切记这一行不可为0
[root@docker-k8s02 ~]# yum makecache

3、打开iptables桥接功能及路由转发 master上进行配置即可

#打开iptables桥接功能
[root@docker-k8s01 ~]# vim /etc/sysctl.d/k8s.conf         # 写入
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
[root@docker-k8s01 ~]# sysctl -p /etc/sysctl.d/k8s.conf         # 刷新并加载配置
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
# PS:如果报错“找不到文件”,需要执行下面的命令以便加载一个模块。
[root@docker-k8s01 ~]# modprobe br_netfilter    #加载br_netfileter模块
#将k8s.conf文件复制到另外两台节点
[root@docker-k8s01 ~]# scp /etc/sysctl.d/k8s.conf docker-k8s02:/etc/sysctl.d/
[root@docker-k8s01 ~]# scp /etc/sysctl.d/k8s.conf docker-k8s03:/etc/sysctl.d/
#在两台node节点上也需要执行如下命令刷新配置
[root@docker-k8s02 ~]# sysctl -p /etc/sysctl.d/k8s.conf 
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
#开启路由转发(三台docker主机上都需要进行以下操作)
[root@docker-k8s01 ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
[root@docker-k8s01 ~]# sysctl -p
net.ipv4.ip_forward = 1

初始化需要几个镜像文件,在初始化过程中会自动下载,但要是网速慢的童鞋可能会很漫长,所以这里提前准备了需要的软件包(提取码:1231),一会上传上去导入即可 三、配置k8s群集

1、安装部署k8s相关工具

注:以下操作在master主机上进行

#安装k8s的master所需组件
[root@docker-k8s01 ~]# yum -y install kubelet-1.15.0-0 kubeadm-1.15.0-0 kubectl-1.15.0-0 
#将kubelet加入开机自启,但不要现在启动
[root@docker-k8s01 ~]# systemctl enable kubelet
[root@docker-k8s01 ~]# mkdir images
[root@docker-k8s01 ~]# cd images/
#将镜像包上传,共8个
[root@docker-k8s01 images]# ls
coredns-1-3-1.tar  kube-apiserver-1-15.tar   kube-proxy-1-15.tar      myflannel-11-0.tar
etcd-3-3-10.tar    kube-controller-1-15.tar  kube-scheduler-1-15.tar  pause-3-1.tar
#接下来导入上传的镜像包到docker镜像中
[root@docker-k8s01 ~]# pwd             # 注:脚本不要和镜像在同一个目录
/root
[root@docker-k8s01 ~]# vim images.sh          # 镜像比较多,写个小脚本代劳下
#!/bin/bash
cd /root/images/
for i in `ls`
do
        docker load < ${i}
done
echo "导入完成"
[root@docker-k8s01 ~]# sh images.sh        # 执行脚本,进行导入镜像

2、初始化k8s集群

[root@docker-k8s01 ~]# kubeadm init --kubernetes-version=v1.15.0 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap
#这里指定的版本必须和前面yum安装的版本一致。指定的两个网络则是官方建议使用的网段
#如果执行上述命令后,返回CPU相关的报错信息,那么需要调大CPU的核心数
#初始化成功后,首先复制下面返回的这条命令,并妥善保存
#若初始化失败,可以执行kubeadm reset进行重置群集

kubeadm join 192.168.171.151:6443 --token oxgsxp.gis96136xisqgfzv 
    --discovery-token-ca-cert-hash sha256:93c5aaa4710fabb9cb5bba9178bb75ecd90031bb4c2471e7ce72939d9ee0c711 

#上面这条命令是用来其他节点加入到当前k8s群集中需要执行的
一旦丢失,特别麻烦,并且只有24小时有效期,每次初始化群集后产生的都不一样
#接下来呢,依次执行返回的其他指令,如下(由于我是root用户,所以就省略了sudo指令)
[root@docker-k8s01 ~]# mkdir -p $HOME/.kube
[root@docker-k8s01 ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@docker-k8s01 ~]# chown $(id -u):$(id -g) $HOME/.kube/config

3、配置master节点状态

[root@docker-k8s01 ~]# kubectl get nodes          # 查看群集节点信息
NAME           STATUS     ROLES    AGE     VERSION
docker-k8s01   NotReady   master   2m57s   v1.15.0
#可以看到master当前状态为未准备,不健康的

接下来可以去github官网进行以下操作以便查看相应的命令

点击进入后,下拉页面到以下位置,并复制指定的命令到master节点执行一下

[root@docker-k8s01 ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

在网络状况良好的情况下建议使用上述方法(调用远端文件执行一下)

若网速较差,建议使用以下方法

#下载到本地
[root@docker-k8s01 ~]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml        
#开头链接中也有此文件可直接上传使用
[root@docker-k8s01 ~]# ls | grep flannel.yml
kube-flannel.yml
[root@docker-k8s01 ~]# kubectl apply -f kube-flannel.yml     # 指定下载的.yml文件执行相应命令
#再次查看群集状态,可以看到master状态已经变为“ready”
[root@docker-k8s01 ~]# kubectl get nodes
NAME           STATUS   ROLES    AGE   VERSION
docker-k8s01   Ready    master   12m   v1.15.0
[root@docker-k8s01 ~]# ls /etc/kubernetes/              # k8s的配置文件目录 
[root@docker-k8s01 ~]# ls /etc/kubernetes/manifests/            # k8s的.yaml文件存放目录

4、配置node01及node02加入master群集

#两台node节点都需执行如下操作
#安装k8s相关组件
[root@docker-k8s02 ~]# yum -y install kubelet-1.15.0-0 kubeadm-1.15.0-0
[root@docker-k8s02 ~]# systemctl enable kubelet      # 设为开机自启,但不启动
[root@docker-k8s02 ~]# mkdir images
[root@docker-k8s02 ~]# cd images/
[root@docker-k8s02 images]# ls        # 上传如下三个镜像包
kube-proxy-1-15.tar  myflannel-11-0.tar  pause-3-1.tar
[root@docker-k8s02 images]# docker load < kube-proxy-1-15.tar 
[root@docker-k8s02 images]# docker load < myflannel-11-0.tar 
[root@docker-k8s02 images]# docker load < pause-3-1.tar 
[root@docker-k8s02 images]# kubeadm join 192.168.171.151:6443 --token oxgsxp.gis96136xisqgfzv     --discovery-token-ca-cert-hash sha256:93c5aaa4710fabb9cb5bba9178bb75ecd90031bb4c2471e7ce72939d9ee0c711                     # 执行master初始化群集时返回的命令,以便加入到master的群集中

两台node节点上配置完成后,再次在master上查看群集信息

[root@docker-k8s01 ~]# kubectl get nodes                # 在master上查看节点信息都为“Ready”
NAME           STATUS     ROLES    AGE     VERSION
docker-k8s01   Ready      master   23m     v1.15.0
docker-k8s02   Ready      <none>   3m35s   v1.15.0
docker-k8s03   NotReady   <none>   4s      v1.15.0

5、部署后的优化配置

为了以后更为方便的使用k8s,建议优化以下几项:

  • 设置table键的默认间距;
  • 设置kubectl命令自动补全;
  • 优化开机自启配置。

1)设置table默认间距(该优化只需在master上进行配置即可,由于经常需要编写.yml文件所以才需要更改table间距)

[root@docker-k8s01 ~]# vim .vimrc                  # 将此参数写入.vimrc文件
[root@docker-k8s01 ~]# bash               # 切换shell环境使配置生效

2)设置kubectl命令自动补全(master和node节点都可配置)

[root@docker-k8s01 ~]# yum -y install bash-completion
[root@docker-k8s01 ~]# source /usr/share/bash-completion/bash_completion 
[root@docker-k8s01 ~]# source <(kubectl completion bash)
[root@docker-k8s01 ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc

3)确认k8s群集没有问题,并设置为开机自启

master主机操作如下

[root@docker-k8s01 ~]# kubectl get pod -n kube-system
#查看pod资源,类似于docker中的容器,确保返回的信息都是running
#“-n kube-system”:是k8s的名称空间

确保状态都为running

master和node节点上都需要进行以下操作,以便设置为开机自启

[root@docker-k8s01 ~]# systemctl enable kubelet
[root@docker-k8s01 ~]# systemctl enable docker 

设置为开机自启后,k8s群集的配置基本完成了,现在可以重启一下这三台服务器,如果重启后,执行下面的命令,状态都还是running,则表示绝对没有问题了