您的位置:首页 > 其它

k8s学习笔记

bodyhugu 2020-09-19 21:05 23 查看 https://blog.51cto.com/1403475

一、使用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运行的状态如下图

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

解决过程:

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文件

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

标签: