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 ( i d − u ) : (id -u): (idu):(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章节

Logo

开源、云原生的融合云平台

更多推荐