k8s 部署多台服务器_二进制方式安装k8s

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

222c24180eb49beacec648d2efe92253.png

如果安装k8s是装修房子。

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

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

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

3696fd17beebb2997a47491e4d86707b.png

一、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#把最后一行注释掉

40a425ad246b4de0483557421dd2ad39.png

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

abb190e12e4b0d89b90e34f7b84b6e11.png

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

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

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

341d15a9aef97a03ec650fff75931cfc.png

4、配置名称解析

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

d2df0f3605a0426835ef43a68a9f9597.png

修改/etc/hosts

ae375d28caf452762f53c3ff1227fdc1.png

重新ping一遍主机名,成功

fb04da579efa9111b60b38c3281c4038.png

5、关闭selinux

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

fb3e47b006b598f070a7efd1d15a65eb.png

6、配置时间同步

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

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

  • 配置k8s-master1

yum install chrony -yvim /etc/chrony.conf#修改下面3个地方

de7c7e8ced625f66d72f61e87514d7d2.png

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

fe6ec007e91d66e3f52c632c6da6dc90.png

  • 配置k8s-node1

vim /etc/chrony.conf#只需要修改一行,ip为master的地址

b5bf854b933a59e5cc33cbb854edabb2.png

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

fe6ec007e91d66e3f52c632c6da6dc90.png

五、给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

b2c3930213f2dfec70baf9854b7e3cce.png

3、自建CA

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

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

2de694b2564b744bcbc00112dd062d01.png

执行:

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

167e031652ccb351b3bd3cf84b094d07.png

创建成功生成4个证书:

72cd6db6c53bff8cc457fd09e02e0251.png

六、mster部署etcd

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

tar -zxvf etcd.tar.gz

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

5b49bdcf029a6ef53e2c91f5d7cffd0d.png

2、迁移文件到指定目录

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

3、配置etcd

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

d833f9960fb900aebb3d8a85fbf79be7.png

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

f6df5c4c2055b99bc23c25159a8b463b.png

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

systemctl start etcd

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

a8e2d7cb13c9dc6bba35abb8007e5a9e.png

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

chmod 777 /opt/etcd/bin/*

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

systemctl enable etcd

4f6683ac83e94c35dbbac4a362626b24.png

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创建成功

87918518c0a963ea0cf2c829c0531f8a.png

八、为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个文件和一个目录

0018669825cbd6f96f74d954e8badc90.png

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

513fce0a0a2fb4393a7375cefb63bd5b.png

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

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

69462311f599fb4a4e05535ebabb730b.png

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

24d5936714a5b19c6049f837a5c74961.png

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

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

6d88b6988c6884b6bdf829a743fdfcf3.png

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

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

6df404a1650d8c7afb15796b79821170.png

7、启用TLS授权

cat /opt/kubernetes/cfg/token.csv

红框为用户名:

deed40549a0557a7f3cb0ae4ac87055c.png

授权操作:

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

授权成功:

8dcb4611bea42f28fb81fb82936f9b8a.png

十、安装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

e0210e020060b4295bbde737809303ec.png

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

64250c373a18942e2daa1cb23d5c5b9e.png

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

cf18dfde0211d597772c0e6cdffe4343.png

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

868f65cebc5b8007e2d765ee40a28d61.png

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则表示启动成功

055f48f124446dfc7f86fe330fb3c1e8.png

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

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

0427787296641360032fb62a6a0a90a7.png

解决方法:

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

36ffb0bdb22ef361083fdddbc7b4b3f2.png

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

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

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

834ac37fb7ef8efdaa8badaf73174e86.png

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

9a08d49be6d24d291af7b0d5c38dfa79.png

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

39669cf6498d8859c4e69ba97a6bb06b.png

十一、安装网络插件

1、查看日志

tailf /opt/kubernetes/logs/kubelet.INFO

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

f9e97d1b085c50c305826ca765f6034b.png

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

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

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

852b618cf9be0d56c2c708a9c4c9b1ea.png

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节点下载镜像。如果镜像下载很慢,记得使用加速器。

b4e38c859b951d59dbadc8c2843353a3.png

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

kubectl get pods -n kube-system

4d186b25ebebc955ea343b77f8568af8.png

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

kubectl get nodes

8f7226c04eba83eeb1573e84f7fcd106.png

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

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

eb74a033abcb6b200f596ac2c3fdd5db.png

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值