单机部署k8s集群
k8s集群中部署Jenkins
- 1. 使用kubeadm部署k8s
- 1.1 k8s服务器部署(master和node均需执行)
- 1.2 master上初始化集群
- 1.3 node加入集群
- 1.4 部署k8s管理界面Kubernetes Dashboard
- 1.5 如何将Pod调度到Master节点
- 1.6 参考资料
- 2 其他部署
- 3 常用命令
- FAQ
- apt-get update时报错: Error in appstreamcli': double free or corruption
- node服务器执行join后,master中pods一直在重启
- docker镜像下载很慢
- ubuntu修改时区
- 使用kubectl delete 删除pod,又自动创建,无法彻底删除
- node上的pod一直在重启
- 彻底删除flannel插件
- kubernetes dashboard启动失败,通过docker logs 查看错误日志
- 安装heapster,monitoring-grafana起不来
- kube-dns状态不正常,日志报错Liveness probe failed: HTTP probe failed with statuscode: 503
- kubenetes无法创建pod/创建RC时无法自动创建pod
- docker中的服务无法访问外网的域名
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
-
设置开机启动
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 (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章节
上一篇: 机器学习 - 自然语言处理(NLP)
下一篇: python学习自然语言处理