欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

单机部署k8s集群

程序员文章站 2022-07-13 10:09:56
...

k8s集群中部署Jenkins

1. 使用kubeadm部署k8s

1.1 k8s服务器部署(master和node均需执行)

首先执行sudo su -进入root模式,再执行如下命令

关闭swap

Kubernetes v1.8+ 要求关闭系统 Swap
vi /etc/fstab
注释掉swap,重启虚拟机
或者直接运行swapoff -a,每次重启都需要执行一次。

修改各服务器hostname,不能出现重复

vi /etc/hostname 
vi /etc/hosts
hostname k8s-master

比如master主机名为k8s-master,node主机名为k8s-node1

安装docker 和kubernetes组件

1)添加apt-key

apt-get update && apt-get install -y apt-transport-https
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -

安装GPG证书

curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add -

修改软件源

sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

2)添加Kubernetes源

echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" > /etc/apt/sources.list.d/kubernetes.list

3)更新包信息

apt-get update

4)安装docker
此处我们需要安装指定版本docker,与k8s v1.10版本配套

apt-get install -y docker-ce=17.03.3~ce-0~ubuntu-xenial

5)安装Kubernetes核心组件
安装v1.10版本的k8s,1.10是目前稳定版本,如果用最新版本会存在各种配套问题。

apt-get install -y kubelet=1.10.13-00 kubeadm=1.10.13-00 kubectl=1.10.13-00 kubernetes-cni=0.6.0-00
  1. 设置开机启动

    systemctl enable kubelet

修改docker driver(v1.10版本k8s不需要配置)

vi /etc/docker/daemon.json,添加
“exec-opts”: [“native.cgroupdriver=systemd”]
如果文件为空需要加上大括号,符合json格式要求。

1.2 master上初始化集群

kubeadm安装的k8s核心组件都是以容器的形式运行于master node上的。

初始化步骤及依赖的yaml文件已经汇总到了start-k8s.sh脚本中,./start-k8s.sh即可启动k8s master。每次需要重启k8s master,先执行kubeadm reset,再执行该脚本。

rm -rf $HOME/.kube/config
echo "--------step 1--------"
export CALICO_IPV4POOL_CIDR=172.16.0.0
kubeadm init --pod-network-cidr=$CALICO_IPV4POOL_CIDR/16

echo "--------step 2--------"
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

echo "--------step 3--------"
kubectl apply -f calico.yaml
kubectl apply -f kubernetes-dashboard.yaml

echo "--------step 4--------"
kubectl create -f http://mirror.faasx.com/kubernetes/heapster/deploy/kube-config/influxdb/influxdb.yaml
kubectl create -f http://mirror.faasx.com/kubernetes/heapster/deploy/kube-config/influxdb/grafana.yaml
kubectl create -f http://mirror.faasx.com/kubernetes/heapster/deploy/kube-config/influxdb/heapster.yaml
kubectl create -f http://mirror.faasx.com/kubernetes/heapster/deploy/kube-config/rbac/heapster-rbac.yaml

echo "--------step 5--------"
kubectl taint node k8s-master1 node-role.kubernetes.io/master-

初始化master

CALICO_IPV4POOL_CIDR的ip段不能与本地网络段相同
export CALICO_IPV4POOL_CIDR=172.16.0.0
kubeadm init --pod-network-cidr=$CALICO_IPV4POOL_CIDR/16
首次初始化,会去下载k8s依赖的镜像,需要等一段时间。
执行完成后要保存好最后一句kubectl join xxx,供node接入集群使用。

初始化kubectl配置

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown (idu):(id -u):(id -g) $HOME/.kube/config
此时查询node状态发现是NotReady,是因为未安装网络插件,安装之后会变成正常状态

部署网络插件calico

kubeadm配合flannel网络插件会有各种问题,此处使用官方推荐的calico。
1)下载calico文件,Kubernetes v1.10版本对应的calico版本为V3.5(官网)。
curl https://docs.projectcalico.org/v3.5/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml -O
2)修改calico.yaml文件
sed -i “s/192.168.0.0/”$CALICO_IPV4POOL_CIDR"/g" calico.yaml
3)创建calico pods
kubectl apply -f calico.yaml
首次执行会去下载calico容器,需要等一段时间状态才会正常。

修改NodePort方式暴露服务的端口的默认范围

默认范围为30000-32767,jenkins agent的默认端口是50000,不在范围内,需要不修改默认范围,只能该jenkins配置,无法兼容已有的jenkins docker agent。

vi /etc/kubernetes/manifests/kube-apiserver.yaml
commands下面添加--service-node-port-range=30000-50000

重启kubelet

systemctl daemon-reload
systemctl restart kubelet

修改dns

1)在/root/resolv/*目录下新建resolv.conf,编写内容为nameserver [局域网dns地址],保存退出.
然后,修改/etc/systemd/system/kubelet.service.d/10-kubeadm.conf,在KUBELET_KUBECONFIG_ARGS下插入上面创建的文件,类似于 --resolv-conf=/root/resolv/resolv.conf
最后,systemctl daemon-reload,systemctl restart kubelet
2)修改所有node节点的/etc/resolv.conf文件,增加nameserver [局域网dns地址]

查看节点状态

kubectl get nodes

查看pods状态

kubectl get pods --all-namespaces

1.3 node加入集群

1)加入
node使用1.2.1章节获取的kubeadm init命令加入集群,但是token有效期只有24小时,如果token过期,可以在master上执行kubeadm token create --print-join-command重新生成一个加入命令
kubeadm join 192.168.193.129:6443 --token wgp16c.6su3jtewj738xt1b
–discovery-token-ca-cert-hash sha256:d9d69c7f342cc347c3d9918461a8e7bdc1487319980d306c385988b3102e2fa6
首次执行会去下载依赖的docker镜像,可使用docker images命令查看下载进度,使用docker ps命令,验证node组件情况。
2)检查
执行完成后,可以在master上使用kubectl get nodes命令查看node节点状态

1.4 部署k8s管理界面Kubernetes Dashboard

master上创建Kubernetes Dashboard

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
首次执行之后会去下载kubernetes-dashboard镜像,也可以先下载镜像再执行该命令sudo docker pull k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1
安装完成之后,不能直接访问,需要配置一下

访问Dashboard

1)proxy方式
master上执行
kubectl proxy --address=[ip]] --disable-filter=true
[ip]为master的对外ip,然后可以通过http://[ip]:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/login进行访问
这种方式只支持在搭建dashboard的机器*问,因为Dashboard只允许localhost和127.0.0.1使用HTTP连接进行访问,而其它地址只允许使用HTTPS。因此,如果需要在非本机访问Dashboard的话,只能选择其他访问方式。
2)nodeport方式
NodePort是将节点直接暴露在外网的一种方式,只建议在开发环境。执行
kubectl -n kube-system edit svc kubernetes-dashboard
将type字段中ClusterIP改为NodePort,posts下增加端口nodePort: 30001(k8s只支持30000以上的端口)
执行命令kubectl get service --all-namespaces
查看kubernetes-dashboard 对应的端口(PORT字段)
使用https://master-ip:30001访问,如果dashboard被部署在node上,则使用https://node-ip:30001
参考官网: https://github.com/kubernetes/dashboard/wiki/Accessing-Dashboard—1.7.X-and-above
更多访问方式参考: https://www.cnblogs.com/RainingNight/p/deploying-k8s-dashboard-ui.html

权限

1)创建admin-token.yaml文件,内容为

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: admin
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io
subjects:
  - kind: ServiceAccount
    name: admin
    namespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin
  namespace: kube-system
  labels:
    kubernetes.io/cluster-service: "true"
    addonmanager.kubernetes.io/mode: Reconcile

2)创建用户

kubectl create -f admin-token.yaml

3)获取登陆token

kubectl describe secret/$(kubectl get secret -nkube-system |grep admin|awk '{print $1}') -nkube-system

4)用火狐登录,将获取的token粘贴到令牌中
目前尝试只有火狐可以

参考: https://blog.csdn.net/java_zyq/article/details/82178152

部署heapster

Heapster是容器集群监控和性能分析工具
执行如下命令安装
kubectl create -f http://mirror.faasx.com/kubernetes/heapster/deploy/kube-config/influxdb/influxdb.yaml
kubectl create -f http://mirror.faasx.com/kubernetes/heapster/deploy/kube-config/influxdb/grafana.yaml
kubectl create -f http://mirror.faasx.com/kubernetes/heapster/deploy/kube-config/influxdb/heapster.yaml
kubectl create -f http://mirror.faasx.com/kubernetes/heapster/deploy/kube-config/rbac/heapster-rbac.yaml

1.5 如何将Pod调度到Master节点

出于安全考虑,默认配置下Kubernetes不会将Pod调度到Master节点。如果希望将k8s-master也当作Node使用,可以执行如下命令:
kubectl taint node k8s-master node-role.kubernetes.io/master-
其中k8s-master是主机节点hostname如果要恢复Master Only状态,执行如下命令:
kubectl taint node k8s-master node-role.kubernetes.io/master=""

1.6 参考资料

k8s使用yaml格式文件来创建pod,yaml是一种标志语言,参考: https://blog.csdn.net/qq_34463875/article/details/55224335

2 其他部署

2.1 部署本地docker仓库

1)通过registry镜像启动一个永久运行的容器

docker run -d -v /data/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest

2)推送一个docker镜像到私有仓库

docker tag registry ip:5000/registry
docker push ip:5000/registry

3)查看推送是否成功

浏览器访问http://ip:5000/v2/_catalog,或者通过命令行curl -XGET http://ip:5000/v2/_catalog

4)列出指定镜像的所有标签

curl -X GET http://<registry_ip>:<registry_port>/v2/<image_name>/tags/list

3 常用命令

参考: https://www.jianshu.com/p/258539db000a

查看集群信息

kubectl cluster-info

查看各组件状态

master:kubectl get componentstatuses
node:kubectl -s http://ip:6443 get componentstatuses

查看rc和namespace

kubectl get rc,namespace

查看pod和svc(和service一样)

kubectl get pods,svc

查看namespace下的pod状态

kubectl get pod -n kube-system -o wide

查看pod状态

kubectl get pod --all-namespaces
kubectl get pod --all-namespaces -o wide
加上-o wide可以看到pods在哪个node上运行

查看各组件状态

kubectl get componentstatuses

查看pod日志

kubectl logs prometheus-tim-3864503240-rwpq5 -n kube-system

查看pod所有容器的日志

kubectl logs -f canal-k9vgz -n kube-system --all-containers

describe

describe类似于get,同样用于获取resource的相关信息。不同的是,get获得的是更详细的resource个性的详细信息,describe获得的是resource集群相关的信息

查看节点详细状态

kubectl describe pod kubernetes-dashboard-5f7b999d65-hx25k -n kube-system

查看kubelet状态

systemctl status kubelet

删除pod

kubectl delete pod curl-66bdcf564-49npq -n default

查询软件的可用版本

apt-cache madison [软件名称],比如docker-ce

查看docker日志

docker logs [contain-id]

查看集群信息

kubectl cluster-info

FAQ

apt-get update时报错: Error in appstreamcli’: double free or corruption

先执行apt-get purge libappstream3,然后再执行apt-get update

通过kubectl logs查看pod节点日志,[FATAL] plugin/loop: Loop (127.0.0.1:49443 -> :53) detected for zone
CoreDNS Forwarding loop 问题
在/root/*目录下新建resolv.conf,编写内容为nameserver 114.114.114.114,保存退出.
然后,修改/etc/systemd/system/kubelet.service.d/10-kubeadm.conf,在KUBELET_KUBECONFIG_ARGS下插入上面创建的文件,类似于 --resolv-conf=/root/resolv/resolv.conf
最后,systemctl daemon-reload,systemctl restart kubelet

kubernetes启动Pod遇到CrashLoopBackOff的解决思路
https://blog.csdn.net/qq_21816375/article/details/79193011

node服务器执行join后,master中pods一直在重启

原因是服务器主机名不能相同,需要修改各服务器主机名。

安装kubernetes-dashboard,启动失败,pod状态一直为ContainerCreating
详细报错:NetworkPlugin cni failed to set up pod “kubernetes-dashboard-7c8b6fcf54-242nr_kube-system” network: failed to set bridge addr: “cni0” already has an IP address different from 192.168.2.1/24"
在master上执行kubectl describe pod kubernetes-dashboard-5f7b999d65-hx25k -n kube-system,查看错误以及安装的node
登陆node,使用systemctl status kubelet查看错误日志如下:CNI failed to retrieve network namespace path: cannot find network namespace
使用journalctl -u kubelet命令查看详细日志
原因: cni0 网桥配置了一个不同网段的 IP 地址导致,删除该网桥(网络插件会自动重新创建)即可修复。(需要安装brctl模块,apt-get install bridge-utils)
ip link set cni0 down
brctl delbr cni0
https://kubernetes.feisky.xyz/pai-cuo-zhi-nan/pod

docker镜像下载很慢

使用镜像加速器,修改/etc/docker/daemon.json文件,增加如下内容:
“registry-mirrors”: [“http://abcd1234.m.daocloud.io/”]
并重启docker服务
service docker restart

ubuntu修改时区

运行如下命令:
sudo tzselect
然后选择亚洲Asia,继续选择中国China,最后选择北京Beijing。
sudo ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

使用kubectl delete 删除pod,又自动创建,无法彻底删除

检查是否创建了deployment任务
kubectl get deployments --all-namespaces
如有,则先删除deployments
kubectl delete deployment $name -n kube-system
再删除pod
Kubectl delete pod xxx -n kube-system
参考
或者通过创建时的yaml文件删除,kubectl delete -f xxx.yaml

node上的pod一直在重启

master上执行kubectl decribe pod xxx查看pod错误日志
node上执行
systemctl status kubelet查看node状态及错误日志
docker ps -a查看pod对应的daocker状态
docker logs [contain-id]查看docker日志,查找详细原因

彻底删除flannel插件

kubeadm reset后,flannel创建的bridge device cni0和网口设备flannel.1依然健在。为了保证环境彻底恢复到初始状态,我们可以通过下面命令删除这两个设备:
ifconfig cni0 down
brctl delbr cni0
ip link delete flannel.1

kubernetes dashboard启动失败,通过docker logs 查看错误日志

Reason: Get http://192.168.193.130:6443/version: net/http: HTTP/1.x transport connection broken: malformed HTTP response “\x15\x03\x01\x00\x02\x02”
因为kube-apiserver默认用的是https,kubernetes-dashboard.yaml中- --apiserver-host=配成了http,连接失败,把这句话注释掉即可

安装heapster,monitoring-grafana起不来

使用docker logs命令查看错误日志如下
Failed to parse /etc/grafana/grafana.ini, open /etc/grafana/grafana.ini
创建一个空的grafana.ini文件即可

kube-dns状态不正常,日志报错Liveness probe failed: HTTP probe failed with statuscode: 503

1)修改node节点中的/etc/resolv.conf文件,增加nameserver [局域网域名服务器]
2)重启kubedns,kubectl delete pod -n kube-system kube-dns-69bf9d5cc9-c68mw
参考

kubenetes无法创建pod/创建RC时无法自动创建pod

身份认证问题,去掉yaml文件中的serviceAccount

docker中的服务无法访问外网的域名

参考1.2章节