年轻人不要碰三样东西:吸毒,赌博,二进制安装k8s。
如果安装k8s是装修房子。
用kubeadm是找整装公司,用二进制则是找游击队。人工和辅材全靠自己,快乐加倍。
这篇文章记录的是我用二进制安装k8s的过程和遇到的各种坑。
如果你还没用过k8s,不建议浪费时间继续阅读。直接去升颗星不香吗?
一、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#把最后一行注释掉
free -m#如果swap这一行为0,则交换分区关闭成功
3、每台主机分别配置主机名
hostnamectl set-hostname k8s-master1hostnamectl set-hostname k8s-node1
直接输入hostname可以查看有没有修改成功
4、配置名称解析
目前直接ping主机名是ping不通的
修改/etc/hosts
重新ping一遍主机名,成功
5、关闭selinux
setenforce 0vim /etc/selinux/config#将SELINUX设置为disabled
6、配置时间同步
选择master1为时间服务器的服务端
其他为时间服务器的客户端
- 配置k8s-master1
yum install chrony -yvim /etc/chrony.conf#修改下面3个地方
#启动并查看是否成功systemctl restart chronydsystemctl enable chronydss -tunl | grep 123
- 配置k8s-node1
vim /etc/chrony.conf#只需要修改一行,ip为master的地址
#启动并查看是否成功systemctl restart chronydsystemctl enable chronydss -tunl | grep 123
五、给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
3、自建CA
cd /root/TLS/etcd./generate_etcd_cert.sh
如果报错找不到命令是因为/user/local/bin没有添加到环境变量
执行:
export PATH=/usr/local/bin:$PATHecho $PATH
创建成功生成4个证书:
六、mster部署etcd
1、/root目录上传etcd.tar.gz并解压
tar -zxvf etcd.tar.gz
解压之后会生成一个文件和一个目录
2、迁移文件到指定目录
mv etcd.service /usr/lib/systemd/systemmv etcd /opt/
3、配置etcd
vim /opt/etcd/cfg/etcd.conf#修改配置里的ip#2380端口和其他etcd通信#2379端口和客户端之间进行通信
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
3、在2个节点依次启动etcd服务
systemctl start etcd
注意:如果etcd启动失败,输入"systemctl status etcd.service" and "journalctl -xe"查看原因。
这个失败的原因是/opt/etcd/bin/etcd没权限
chmod 777 /opt/etcd/bin/*
4、所有节点设置开机自启动
systemctl enable etcd
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创建成功
八、为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个文件和一个目录
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
# 修改controller-manager配置vim /opt/kubernetes/cfg/kube-controller-manager.conf
如果地址本来就是127.0.0.1,则不需要更改
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
5、如果apiserver报错,可以输入下面指令查看日志:
cat /var/log/messages|grep kube-apiserver|grep -i error
6、将kubectl指令放到环境变量里
cp /opt/kubernetes/bin/kubectl /bin/#任意目录输kubectl都可以执行了kubectl get ns
7、启用TLS授权
cat /opt/kubernetes/cfg/token.csv
红框为用户名:
授权操作:
kubectl create clusterrolebinding kubelet-bootstrap \--clusterrole=system:node-bootstrapper \--user=kubelet-bootstrap#删除授权# kubectl delete clusterrolebindings kubelet-bootstrap
授权成功:
十、安装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
vim /opt/kubernetes/cfg/kube-proxy-config.yml#修改主机名为当前主机
vim /opt/kubernetes/cfg/kubelet.conf # 改为当前主机名
vim /opt/kubernetes/cfg/bootstrap.kubeconfig#修改为master的ip
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则表示启动成功
如果报错可以使用下面的指令查看具体错误原因:
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
解决方法:
yum install ipset -ysystemctl restart kube-proxy.service#重新查看proxy服务,没有报错了
8、master节点为worker节点颁发证书
切换到master节点执行以下指令:
kubectl get csr#当前是pending 是申请中的状态
kubectl certificate approve node-csr-jN_inxGEiMEmkofhoxyEKGVH8kuuwEJSIexNuyEcKsQ#最后的参数是第一步执行的name#重新查看状态,新状态是已颁发kubectl get csr
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
十一、安装网络插件
1、查看日志
tailf /opt/kubernetes/logs/kubelet.INFO
看到报错:Unable to update cni config: no networks found in /etc/cni/net.d
是因为网络插件还没有安装,下面就是来安装插件
2、node1节点确认已经启用了cni插件
cat /opt/kubernetes/cfg/kubelet.conf#如果network-plugin=cni则已启用
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节点下载镜像。如果镜像下载很慢,记得使用加速器。
6、安装完成后查看pods状态。READY则安装成功
kubectl get pods -n kube-system
7、查看work节点状态,也变成Ready了
kubectl get nodes
如果你安装到这一步了,只能说明你运气好。
如果你没安装到这一步,建议重装系统,按照上面写的再来一遍。
下一章分享k3s的安装和使用,保证比k8s更快乐。