运维开发网

k8s学习笔记

运维开发网 https://www.qedev.com 2020-09-20 13:08 出处:51CTO 作者:wx5bcc50890840d
一、使用configmap、pv、hostpath方式挂载外部文件不覆盖原镜像系统目录下的文件示例:推荐写法:定义一个volumesvolumes:name:visual-query-configmapconfigMap:name:visual-query-configmap#name配置必须与configmap名称一样定义容器挂载点volumeMountsvolumeMounts:name:vi

一、使用configmap、pv、hostpath方式挂载外部文件不覆盖原镜像系统目录下的文件

示例:

推荐写法:

定义一个volumes

volumes:

  • name: visual-query-configmap

    configMap:

    name: visual-query-configmap #name配置必须与configmap名称一样

定义容器挂载点volumeMounts

volumeMounts:

  • name: visual-query-configmap #configmap名称

    mountPath: /app/config/application.properties #容器挂载路径

    subPath: application.properties #挂载文件名

定义一个volumes

volumes:

  • name: nginx-configmap

    configMap:

    name: nginx-configmap

    items:

    • key: nginx.conf

      path: etc/nginx/nginx.conf

定义容器挂载点volumeMounts

volumeMounts:

  • name: nginx-configmap

    mountPath: /etc/nginx/nginx.conf

    subPath: etc/nginx/nginx.conf

二、helm 将应用配置文件放在chart目录内通过编写templates下的configmap.yaml动态将目录中的配置文件渲染为configmap。最终打包为chart

示例:

templates/configmap.yaml文件

apiVersion: v1

kind: ConfigMap

metadata:

creationTimestamp: null

name: helm-stella-service-configmap

data:

{{ (.Files.Glob "stella-conf/").AsConfig | indent 2 }} #使用模板集成函数.Files.Glob,stella-conf/ 为指定目录,路径为chart目录下并非linux系统绝对路径

例如chart目录为stella-service,该目录下的层级关系为

charts Chart.yaml stella-conf stella.sql templates values.yaml

三、k8s yaml 修改pod hosts文件

spec:

hostAliases:

  • ip: "192.168.10.181"

    hostnames:

    • "cdh6-krb5.senses-ai.com"
    • "cdh6kdc"

      四、yaml 设置以hostNetwork模式启动

spec:

selector:

matchLabels:

app: livy-krb-cdh6

template:

metadata:

labels:

app: livy-krb-cdh6

spec:

hostNetwork: true #使用宿主机网络模式,默认不配置为false,当为true时候必须指定端口.

五、使用kubeadm 部署k8s集群证书过期解决过程(版本1.15.3不同版本更新方法不一样)

描述:使用kubeadm部署默认ca.crt根证书有效期为10年,其他组件证书有效期为1年。例如:apiserver、etcd、kubelet、scheduler等组件。

遗留问题:证书过期后,apiserver服务会因为无法与各个组件进行交互而挂掉,在我们使用命令kubectl get pod时k8s会提示无法连接6433端口。如果在生产环境将造成非常严重的后果和损失,所以在我们使用kubeadm部署一个新的k8s集群首次一定要把证书的有效期设置的大一些。

故障描述:登陆k8s master节点使用kubectl get pod命令返回如下信息,查看系统端口后确实没有监听6443端口。这时已经可以判定为k8s集群已经挂了。6443为apiserver组件的服务端口,如果6443端口未监听则说明组件间无法正常交互所有的pod都会挂掉。

The connection to the server 192.168.10.10:6443 was refused - did you specify the right host or port?

排除思路:查看kubelet服务是否为启动状态,如果为启动状态也要重启一下有的时候进程可能会进入假死状态,表面上是启动的状态实际上已经不运行了。如果为未启动状态则直接重启。如果是证书过期的问题重启后再次查看kubelet运行的状态如下图

k8s学习笔记

之后我们使用系统命令查看该服务详细的报错信息,下图就可以看出来具体的原因了。

k8s学习笔记

解决过程:

1.在进行证书之前,首先进行备份。

cp -r /etc/kubernetes /etc/kubernetes.bak

cp -r .kube .kube.bak

cp -r /var/lib/etcd /var/lib/etcd.bak

2.首先查看证书是否有效。下图为我更新后的有效期。

openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep ' Not ' #路径后面可以指定不通的crt文件

k8s学习笔记

3.在当前目录下编辑配置文件kubeadm.conf并写入以下内容。

apiVersion: kubeadm.k8s.io/v1beta1

kind: ClusterConfiguration

kubernetesVersion: v1.15.3 # kubernetes 版本

apiServer:

certSANs:

  • 192.168.10.10 # master 所有节点IP地址,包括master和node
  • 192.168.10.60
  • 192.168.10.20

    extraArgs:

    service-node-port-range: 80-32767 #service nodeport 端口范围

    advertise-address: 0.0.0.0

    controlPlaneEndpoint: "192.168.10.10:6443" #APIserver 地址,也就是master节点地址

    imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers #这里使用国内的镜像仓库,否则在重新签发的时候会报错

    4.更新证书的命令。

#执行该命令就会重新签发证书,默认为1年

kubeadm alpha certs renew all --config kubeadm.conf

#查看有效期

sudo openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep ' Not '

输出:

Not Before: Sep 16 10:35:33 2019 GMT

Not After : Sep 15 17:14:19 2021 GMT

5.重新生成配置文件。

kubeadm init phase kubeconfig all --config kubeadm.conf

6.更新.kube下的配置文件。

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

7.重启kube-apiserver,kube-controller,kube-scheduler,etcd这4个容器

docker ps | grep -v pause | grep -E "etcd|scheduler|controller|apiserver" | awk '{print $1}' | awk '{print "docker","restart",$1}' | bash

8.重启kubelet服务,查看集群node状态。(如果node脱落集群,需要重新生成token,之后join至集群)

systemctl restart kubelet

systemctl status kubelet

kubectl get node -o wide

六、删除一直处于Terminating的状态的namespace

1.导出namespace资源定义

kubectl get ns ${namespace-name} -o json > tmp.json

2.编辑tmp.json资源定义文件,然后删除其中的 spec 字段(因为其中会包括 finalizers 字段)一并删掉。

3.创建代理服务器

kubectl proxy

4.curl 调用删除 ns

curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json http://127.0.0.1:8001/api/v1/namespaces/${namespace-name}/finalize

扫码领视频副本.gif

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号