一、使用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系统绝对路径

三、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时候必须指定端口.

五、删除一直处于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

六、helm chart定义容器中多个env

1.deployment.yaml中定义

env:
{{- range $key, $value := .Values.env }}
- name: {{ $key }}
  value: {{ $value | quote }}
{{- end }}

2.values.yaml 传入key 和value

env:
  HADOOP_CONF_DIR: "/opt/hadoop/etc/hadoop"
  HADOOP_HOME: "/opt/hadoop"
  KERBEROS_ENABLED: "true"
  KERBEROS_KEYTAB: "/opt/tw.keytab"
  KERBEROS_PRINCIPAL: "tw@CDH6.COM"
  TZ: "Asia/Shanghai"

七、k8s部署redis设置redis登陆密码

遇到到问题:

按照docker-compose部署的方式,将redis.conf已configmap的形式挂载到容器内的/etc/下之后正常启动redis应该就可以启动了。然后redis启动后仍然没有开启密码这就奇怪了。

配置文件明明配置了密码的呀。于是怀疑到了配置文件没有生效。查看docker hub redis Dockerfile发现Dockerfile最后一行为CMD ["redis-server"],并没有指定redis的配置文件。

为了测试我将configmap挂载到了pod的/tmp目录下,然后进行了一个全盘的搜索只查找到了一个redis.conf并且是我挂载的。也就是说这个官方提供的镜像中没有配置文件。

解决思路:在启动redis的时候指定配置文件

解决方法:

redis.conf配置文件的内容,注意这里只留必要的参数。尤其是带路径的配置一定要看好了,路径一定得是容器中存在的路径,否则在启动redis的时候就会报错。

bind 0.0.0.0
port 6379
requirepass shanjing0322
pidfile .pid
appendonly yes
cluster-config-file nodes-6379.conf
dir /data/
cluster-node-timeout 5000
protected-mode no

redis deployment.yaml 增加以下部分

command: ["sh","-c","exec redis-server /etc/redis.conf"]

八、kubernetes的configmap格式错乱问题json/yaml格式化

kubectl get cm rules-configmap -n monitoring -o json | jq '.data."ingress-nginx.yaml"' -r

九、获取所有deployment的副本和cpu、内存

kubectl get deployment -n spatio-prod -o=custom-columns=服务名:metadata.name,副本数量:spec.replicas,CPU:spec.template.spec.containers[0].resources.limits.cpu,内存:spec.template.spec.containers[0].resources.limits.memory

十、更新daemonSet、deployment 实现每次更新一个容器

利用maxSurge、maxUnavailable 实现

  updateStrategy:
    rollingUpdate:
      maxSurge: 0
      maxUnavailable: 1
    type: RollingUpdate

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐