年轻人不要碰三样东西:吸毒,赌博,二进制安装k8s。

zabbix 二进制 安装 二进制安装k8s_zabbix 二进制 安装

如果安装k8s是装修房子。

用kubeadm是找整装公司,用二进制则是找游击队。人工和辅材全靠自己,快乐加倍。

这篇文章记录的是我用二进制安装k8s的过程和遇到的各种坑。

如果你还没用过k8s,不建议浪费时间继续阅读。直接去升颗星不香吗?

zabbix 二进制 安装 二进制安装k8s_zabbix 二进制 安装_02

一、K8S简介

1、什么是K8S

Kubernetes是Google在2014年开源的一个容器集群管理系统,

本质上是一组服务器集群,k8s可以在集群的各个节点上运行特定的docker容器。

K8S用于容器化应用程序的部署、扩展和管理。

K8S的目标是让部署容器化应用简单高效。

k8s的入门教程:

https://kubernetes.io/zh/docs/concepts/services-networking/ingress/

2、K8S特性

  • 自我修复
  • 弹性伸缩
  • 自动部署和回滚
  • 服务发现和负载均衡
  • 机密和配置管理
  • 存储编排
  • 批处理

3、k8s集群分为两类节点

master node:主节点的组件(程序):

    API server:接收客户端操作k8s命令

    schduler:从多个worder node节点的组件中选举一个来启动服务

    controller manager:向worker节点的kubelet发送指令

    etcd:数据库。保存集群状态数据,比如pod、service等对象信息。

worker node:工作节点的组件(程序):

    kubelet:向docker发送指令管理docker容器

    kubeproxy:管理docker容器的网络

二、K8S核心概念

1、pod——容器组:

  • k8s最小部署单元
  • 一组容器的集合,一个pod中可以有一个或者多个容器
  • 一个pod中的容器共享网络命名空间

2、controllers——控制器:

  • 控制、启动、删除pod
  • deployment

3、service——服务:

  • 每一个pod启动的时候会把自己的ip注册到service里
  • service将一组pod关联起来,提供一个统一的入口
  • 即使pod地址发生改变,这个统一入口也不会变化,可以保证用户访问不受影响

4、label——标签:

  • 一组pod是一个统一的标签
  • service是通过标签和一组pod来进行关联的

5、namespace——命名空间:

  • 为不同公司的pod提供隔离的运行环境
  • 为开发环境、测试环境、生成环境分别准备不同的名称空间、进行隔离

三、集群规划

因为服务器有限,我只用了2台来装,1台master,1台node。

  • master  主机名:k8s-master1
  • worker1  主机名:k8s-node1
  • k8s版本:1.16
  • 安装方式:离线-二进制
  • 操作系统版本:centos-7.2

四、初始化服务器

1、关闭防火墙

systemctl stop firewalledsystemctl disable firewalled

2、关闭交换分区

swapoff -avim /etc/fstab#把最后一行注释掉

zabbix 二进制 安装 二进制安装k8s_json_03

free -m#如果swap这一行为0,则交换分区关闭成功

zabbix 二进制 安装 二进制安装k8s_vim_04

3、每台主机分别配置主机名

hostnamectl set-hostname k8s-master1hostnamectl set-hostname k8s-node1

直接输入hostname可以查看有没有修改成功

zabbix 二进制 安装 二进制安装k8s_vim_05

4、配置名称解析

目前直接ping主机名是ping不通的

zabbix 二进制 安装 二进制安装k8s_vim_06

修改/etc/hosts

zabbix 二进制 安装 二进制安装k8s_vim_07

重新ping一遍主机名,成功

zabbix 二进制 安装 二进制安装k8s_k8s 部署多台服务器_08

5、关闭selinux

setenforce 0vim /etc/selinux/config#将SELINUX设置为disabled

zabbix 二进制 安装 二进制安装k8s_zabbix 二进制 安装_09

6、配置时间同步

    选择master1为时间服务器的服务端

    其他为时间服务器的客户端

  • 配置k8s-master1
yum install chrony -yvim /etc/chrony.conf#修改下面3个地方

zabbix 二进制 安装 二进制安装k8s_vim_10

#启动并查看是否成功systemctl restart chronydsystemctl enable chronydss -tunl | grep 123

zabbix 二进制 安装 二进制安装k8s_vim_11

  • 配置k8s-node1
vim /etc/chrony.conf#只需要修改一行,ip为master的地址

zabbix 二进制 安装 二进制安装k8s_json_12

#启动并查看是否成功systemctl restart chronydsystemctl enable chronydss -tunl | grep 123

zabbix 二进制 安装 二进制安装k8s_vim_11

五、给etcd颁发证书

先颁发证书,后续再安装etcd

1、上传TLS安装包到/root目录

安装包放到文章最后

2、解压并修改TLS配置

#将TLS.tar.gz包放到/root目录下tar -zxvf TLS.tar.gzcd TLS#添加cfs*命令到环境变量./cfssl.shcd etcd/vim server-csr.json #修改hosts为主机ip

zabbix 二进制 安装 二进制安装k8s_zabbix 二进制 安装_14

3、自建CA

cd /root/TLS/etcd./generate_etcd_cert.sh

如果报错找不到命令是因为/user/local/bin没有添加到环境变量

zabbix 二进制 安装 二进制安装k8s_vim_15

执行:

export PATH=/usr/local/bin:$PATHecho $PATH

zabbix 二进制 安装 二进制安装k8s_zabbix 二进制 安装_16

创建成功生成4个证书:

zabbix 二进制 安装 二进制安装k8s_json_17

六、mster部署etcd

1、/root目录上传etcd.tar.gz并解压

tar -zxvf etcd.tar.gz

解压之后会生成一个文件和一个目录

zabbix 二进制 安装 二进制安装k8s_vim_18

2、迁移文件到指定目录

mv etcd.service /usr/lib/systemd/systemmv etcd /opt/

3、配置etcd

vim /opt/etcd/cfg/etcd.conf#修改配置里的ip#2380端口和其他etcd通信#2379端口和客户端之间进行通信

zabbix 二进制 安装 二进制安装k8s_json_19

4、将之前生成的根证书和服务证书复制到etcd目录

cd /root/TLS/etcd/cp ca.pem /opt/etcd/ssl/cp server.pem /opt/etcd/ssl/cp server-key.pem /opt/etcd/ssl/

七、node部署etcd

1、master复制下面文件到node

scp /usr/lib/systemd/system/etcd.service root@k8s-node1:/usr/lib/systemd/system/scp -r /opt/etcd/ root@k8s-node1:/opt/

2、node上修改配置文件

vim /opt/etcd/cfg/etcd.conf# 注意修改ETCD_NAME

zabbix 二进制 安装 二进制安装k8s_zabbix 二进制 安装_20

3、在2个节点依次启动etcd服务

systemctl start etcd

注意:如果etcd启动失败,输入"systemctl status etcd.service" and "journalctl -xe"查看原因。

zabbix 二进制 安装 二进制安装k8s_vim_21

这个失败的原因是/opt/etcd/bin/etcd没权限

chmod 777 /opt/etcd/bin/*

4、所有节点设置开机自启动

systemctl enable etcd

zabbix 二进制 安装 二进制安装k8s_json_22

5、检查etcd是否启动成功

/opt/etcd/bin/etcdctl \ --ca-file=/opt/etcd/ssl/ca.pem --cert-file=/opt/etcd/ssl/server.pem --key-file=/opt/etcd/ssl/server-key.pem \ --endpoints="https://10.12.10.56:2379,https://10.12.10.57:2379" \ cluster-health

看到以下节点都是健康的,则etcd创建成功

zabbix 二进制 安装 二进制安装k8s_zabbix 二进制 安装_23

八、为master自签证书

1、新建一个/root/test文件夹,在文件夹下新增4个json文件,注意最后一个json要修改ip

[root@k8s-master01 k8s]# vim ca-csr.json {    "CN": "kubernetes",    "key": {        "algo": "rsa",        "size": 2048    },    "names": [        {            "C": "CN",            "L": "HuBei",            "ST": "WuHan",            "O": "k8s",            "OU": "System"        }    ]}[root@k8s-master01 k8s]# vim ca-config.json {  "signing": {    "default": {      "expiry": "876000h"    },    "profiles": {      "kubernetes": {         "expiry": "876000h",         "usages": [            "signing",            "key encipherment",            "server auth",            "client auth"        ]      }    }  }}[root@k8s-master01 k8s]# vim kube-proxy-csr.json {  "CN": "system:kube-proxy",  "hosts": [],  "key": {    "algo": "rsa",    "size": 2048  },  "names": [    {      "C": "CN",      "L": "HuBei",      "ST": "WuHan",      "O": "k8s",      "OU": "System"    }  ]}[root@k8s-master01 k8s]# vim server-csr.json {    "CN": "kubernetes",    "hosts": [      "10.0.0.1",      "127.0.0.1",      "kubernetes",      "kubernetes.default",      "kubernetes.default.svc",      "kubernetes.default.svc.cluster",      "kubernetes.default.svc.cluster.local",      "10.16.8.150",      "10.16.8.151"    ],    "key": {        "algo": "rsa",        "size": 2048    },    "names": [        {            "C": "CN",            "L": "HuBei",            "ST": "WuHan",            "O": "k8s",            "OU": "System"        }    ]}

2、自建CA:

cfssl gencert -initca ca-csr.json | cfssljson -bare ca -

3、生成证书:

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare servercfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy

九、部署master

1、在/root目录上传并解压文件

tar -zxvf k8s-master.tar.gz

解压成3个文件和一个目录

zabbix 二进制 安装 二进制安装k8s_vim_24

2、移动文件

mv kube-apiserver.service kube-controller-manager.service kube-scheduler.service /usr/lib/systemd/systemmv kubernetes /opt/#需要先为apiserver自签证书cp /root/test/*.pem /opt/kubernetes/ssl/ -rvfvim /opt/kubernetes/cfg/kube-apiserver.conf# 修改以下几个ip

zabbix 二进制 安装 二进制安装k8s_k8s 部署多台服务器_25

# 修改controller-manager配置vim /opt/kubernetes/cfg/kube-controller-manager.conf

如果地址本来就是127.0.0.1,则不需要更改

zabbix 二进制 安装 二进制安装k8s_vim_26

3、启动master

systemctl start kube-apiserver.service systemctl enable kube-apiserver.service systemctl start kube-scheduler.service systemctl enable kube-scheduler.service systemctl start kube-controller-manager.service systemctl enable kube-controller-manager.service

4、查看master是否启动成功

systemctl status kube-apiserver.servicesystemctl status kube-scheduler.servicesystemctl status kube-controller-manager.service

zabbix 二进制 安装 二进制安装k8s_vim_27

5、如果apiserver报错,可以输入下面指令查看日志:

cat /var/log/messages|grep kube-apiserver|grep -i error

zabbix 二进制 安装 二进制安装k8s_zabbix 二进制 安装_28

6、将kubectl指令放到环境变量里

cp /opt/kubernetes/bin/kubectl /bin/#任意目录输kubectl都可以执行了kubectl get ns

zabbix 二进制 安装 二进制安装k8s_vim_29

7、启用TLS授权

cat /opt/kubernetes/cfg/token.csv

红框为用户名:

zabbix 二进制 安装 二进制安装k8s_k8s 部署多台服务器_30

授权操作:

kubectl create clusterrolebinding kubelet-bootstrap \--clusterrole=system:node-bootstrapper \--user=kubelet-bootstrap#删除授权# kubectl delete clusterrolebindings kubelet-bootstrap

授权成功:

zabbix 二进制 安装 二进制安装k8s_vim_31

十、安装node组件

node安装容器的过程是 master发送指令到node上的kubelet,kubelet再发送指令给本机的docker来进行安装。

所以安装node主要是安装以下3个组件:

  • docker:启动容器
  • kubectl:接收apiserver的指令,然后控制docker容器
  • kube-proxy:为worker上的容器配置网络

以下的操作都是在node1服务器上操作

1、在/root目录上传k8s-node.tar.gz并解压

tar -zxvf k8s-node.tar.gz

2、离线安装docker

tar xf docker-18.09.6.tgz cp docker/* /usr/bin/cp docker/* /bin/vim /etc/systemd/system/docker.servicechmod +x /etc/systemd/system/docker.service   systemctl daemon-reload  systemctl start dockersystemctl enable docker.servicedocker -v

docker.service:

[Unit]Description=Docker Application Container EngineDocumentation=https://docs.docker.comAfter=network-online.target firewalld.service containerd.serviceWants=network-online.target[Service]Type=notifyExecStart=/usr/bin/dockerdExecReload=/bin/kill -s HUP $MAINPIDTimeoutSec=0RestartSec=2Restart=alwaysStartLimitBurst=3StartLimitInterval=60sLimitNOFILE=infinityLimitNPROC=infinityLimitCORE=infinityTasksMax=infinityDelegate=yesKillMode=process[Install]WantedBy=multi-user.target

3、安装kubelet

移动文件

mv kubelet.service kube-proxy.service /usr/lib/systemd/system/mv kubernetes /opt/

修改配置文件

vim /opt/kubernetes/cfg/kube-proxy.kubeconfig#把下面的ip改成master的ip

zabbix 二进制 安装 二进制安装k8s_zabbix 二进制 安装_32

vim /opt/kubernetes/cfg/kube-proxy-config.yml#修改主机名为当前主机

zabbix 二进制 安装 二进制安装k8s_zabbix 二进制 安装_33

vim /opt/kubernetes/cfg/kubelet.conf # 改为当前主机名

zabbix 二进制 安装 二进制安装k8s_vim_34

vim /opt/kubernetes/cfg/bootstrap.kubeconfig#修改为master的ip

zabbix 二进制 安装 二进制安装k8s_vim_35

4、从master节点来复制证书到worker节点

切换到mster节点执行下面命令:

scp /root/test/{ca.pem,kube-proxy.pem,kube-proxy-key.pem} root@k8s-node1:/opt/kubernetes/ssl/

5、切换到node1节点执行下面命令:

systemctl start kube-proxysystemctl start kubeletsystemctl enable kube-proxysystemctl enable kubelet

6、查看node1是否启动成功

systemctl status kube-proxy.servicesystemctl status kubelet.service

都是active则表示启动成功

zabbix 二进制 安装 二进制安装k8s_zabbix 二进制 安装_36

如果报错可以使用下面的指令查看具体错误原因:

journalctl _PID=26847

7、查看kube-proxy,有报错:

can't determine whether to use ipvs proxy, error: error getting ipset version, error: executable file not found in $PATH

zabbix 二进制 安装 二进制安装k8s_k8s 部署多台服务器_37

解决方法:

yum install ipset -ysystemctl restart kube-proxy.service#重新查看proxy服务,没有报错了

zabbix 二进制 安装 二进制安装k8s_json_38

8、master节点为worker节点颁发证书

切换到master节点执行以下指令:

kubectl get csr#当前是pending 是申请中的状态

zabbix 二进制 安装 二进制安装k8s_json_39

kubectl certificate approve node-csr-jN_inxGEiMEmkofhoxyEKGVH8kuuwEJSIexNuyEcKsQ#最后的参数是第一步执行的name#重新查看状态,新状态是已颁发kubectl get csr

zabbix 二进制 安装 二进制安装k8s_vim_40

9、强制删除pod

kubectl get pod -n kube-systemkubectl delete pod xxx --namespace=kube-system --grace-period=0 --force

9、重新查看node节点,这次node节点添加成功了,但是STATUS状态还是NotReady

kubectl get nodes

zabbix 二进制 安装 二进制安装k8s_k8s 部署多台服务器_41

十一、安装网络插件

1、查看日志

tailf /opt/kubernetes/logs/kubelet.INFO

看到报错:Unable to update cni config: no networks found in /etc/cni/net.d

zabbix 二进制 安装 二进制安装k8s_zabbix 二进制 安装_42

是因为网络插件还没有安装,下面就是来安装插件

2、node1节点确认已经启用了cni插件

cat /opt/kubernetes/cfg/kubelet.conf#如果network-plugin=cni则已启用

zabbix 二进制 安装 二进制安装k8s_k8s 部署多台服务器_43

3、在node1上创建工作目录

mkdir -pv /opt/cni/bin /etc/cni/net.d

4、node1之前从k8s-node.tar解压出来一个cni压缩包,再次解压到新建的工作目录

tar -zxvf cni-plugins-linux-amd64-v0.8.2.tgz -C /opt/cni/bin/

5、在master节点上执行yaml脚本,实现在node节点安装启动网络插件功能

切换节点到master,在根目录上传并解压YAML.zip

unzip YAML.zipcd YAML/kubectl apply -f kube-flannel.yaml# 在worker节点下载镜像。如果镜像下载很慢,记得使用加速器。

zabbix 二进制 安装 二进制安装k8s_k8s 部署多台服务器_44

6、安装完成后查看pods状态。READY则安装成功

kubectl get pods -n kube-system

zabbix 二进制 安装 二进制安装k8s_zabbix 二进制 安装_45

7、查看work节点状态,也变成Ready了

kubectl get nodes

zabbix 二进制 安装 二进制安装k8s_vim_46

如果你安装到这一步了,只能说明你运气好。

如果你没安装到这一步,建议重装系统,按照上面写的再来一遍。

zabbix 二进制 安装 二进制安装k8s_json_47

下一章分享k3s的安装和使用,保证比k8s更快乐。