Pod练习(二)

本文所实验的Pod:

configmap,Downward API,Service Account,容器健康检查,PodPreset

实例:

# cat mysql.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mysql
spec:
  containers:
  - name: mymap
    image: mysql:5.7
    args:
    - sleep
    - "86400"
    volumeMounts:
    - name: mycfmap
      mountPath: "/etc/mysql"
  volumes:
  - name: mycfmap
    configMap:
      name: mycfmap

#cat my.cnf
a=1
b=2

#创建configmap
kubectl create configmap mycfmap --from-file=./my.cnf

使用configmap进行的挂载,mountPath所指的路径有就覆盖,没有就创建。因此,在容器中的/etc/mysql/里只有my.cnf,其余的文件都被覆盖

1 从普通文件创建

  kubectl  create  configmap mysql-cnf  --from-file=my-cnf=./my.cnf

2 从 yaml 文件创建

# ./kustomization.yaml
configMapGenerator:
- name:  mysql-cnf
  files:
  - my-cnf=./my.cnf


kubectl apply -f ./kustomization.yaml

Pod使用

  1. 更新
    更新 Etcd 中配置数据
apiVersion: v1
kind: Pod
metadata:
  name: test-configmap
spec:
  containers:
  - name: test-configmap-volume
    image: busybox
    args:
    - sleep
    - "86400"
    volumeMounts:
    - name: mysqlcfmap
      mountPath: "/etc/config" # 挂载到容器中目录,这个目录会自动创建
  volumes:
  - name: mysqlcfmap
    configMap:
       name: mycnf  # 创建 configmap 对象的名称
       items:
       - key: my-cnf   # 创建  configmap 对象时指定的 key
         path: my.cnf  # 容器 a 目录中的文件名

/etc/config/my.cnf # 软链接


不更新

apiVersion: v1
kind: Pod
metadata:
  name: test-configmap
spec:
  containers:
  - name: test-configmap-volume
    image: busybox
    args:
    - sleep
    - "86400"
    volumeMounts:
    - name: mysqlcfmap
      mountPath: "/etc/my.cnf" # 挂载到容器中目录,这个目录会自动创建
      subPath: my.cnf
  volumes:
  - name: mysqlcfmap
    configMap:
       name: mycnf  # 创建 configmap 对象的名称
       items:
       - key: my-cnf   # 创建  configmap 对象时指定的 key
         path: my.cnf  # 容器 a 目录中的文件名

/etc/my.cnf # 普通文件

Ps:当然如果mountPath后面的路径不存在,那么就会在容器中创建该目录,要映射的文件也不会映射进去;如果存在,那么就会将原来的备份,并将文件映射到指定位置

Downward API

作用:让 Pod 里的容器能够直接获取到这个 Pod API 对象本身的信息。

实例:

apiVersion: v1
kind: Pod
metadata:
  name: test-downwardapi-volume
  labels:
    zone: us-est-coast
    cluster: test-cluster1
    rack: rack-22
spec:
  containers:
    - name: client-container
      image: busybox
      command: ["sh", "-c"]
      args:
      - while true; do
          if [[ -e /etc/podinfo/labels ]]; then
            echo -en '\n\n';  cat /etc/podinfo/labels;cat; echo -en '\n' ; cat /etc/podinfo/rourou; fi;
          sleep 5;
        done;
      volumeMounts:
        - name: podinfo
          mountPath: /etc/podinfo
          readOnly: false
  volumes:
    - name: podinfo
      projected:
        sources:
        - downwardAPI:
            items:
              - path: "labels"
                fieldRef:
                  fieldPath: metadata.labels
              - path: "rourou"
                fieldRef:
                  fieldPath: metadata.name

验证:

kubectl logs test-downwardapi-volume
得到结果:
cluster="test-cluster1"
rack="rack-22"
zone="us-est-coast"
test-downwardapi-volume

Service Account

集群验证的信息位于:/vat/run/secrets/kubernetes.io/serviceaccount目录下
ca.crt
namespace
token
三个文件

容器健康检查和恢复机制

在 Kubernetes 中,你可以为 Pod 里的容器定义一个健康检查“探针”(Probe)。这样,kubelet 就会根据这个 Probe 的返回值决定这个容器的状态,而不是直接以容器进行是否运行(来自 Docker 返回的信息)作为依据。这种机制,是生产环境中保证应用健康存活的重要手段

基础实例

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness
spec:
  containers:
  - name: liveness
    image: busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 5
      periodSeconds: 5

#通过查看/tmp/healthy文件是否存在确定容器运行状态,initialDelaySeconds(容器启动后几秒后开始检查),periodSeconds(每几秒检查一次)。可以看到 RESTARTS的数字发生了变化

需要注意的是:Kubernetes 中并没有 Docker 的 Stop 语义。所以虽然是 Restart(重启),但实
际却是重新创建了容器.这个功能就是 Kubernetes 里的Pod 恢复机制,也叫 restartPolicy。它是 Pod 的 Spec 部分的一个标准字段(pod.spec.restartPolicy),默认值是 Always,即:任何时候这个容器发生了异常,它一定会被重新创建

Pod 的恢复过程,永远都是发生在当前节点上,而不会跑到别的节点上去。事实上,一旦一个 Pod 与一个节点(Node)绑定,除非这个绑定发生了变化(pod.spec.node 字段被修改),否则它永远都不会离开这个节点。这也就意味着,如果这个宿主机宕机了,这个 Pod 也不会主动迁移到其他节点上去,而如果你想让 Pod 出现在其他的可用节点上,就必须使用 Deployment 这样的“控制器”来管理
Pod

而作为用户,你还可以通过设置 restartPolicy,改变 Pod 的恢复策略。除了 Always,它还有OnFailure 和 Never 两种情况:
Always:在任何情况下,只要容器不在运行状态,就自动重启容器;
OnFailure: 只在容器 异常时才自动重启容器;
Never: 从来不重启容器。

通过TCP或HTTP监听状态

监听HTTP端口

apiVersion: v1
kind: Pod
metadata:  # pod 的源数据信息,可以写多个
  name: nginx-http  # pod 的名字
spec:
  containers:
  - name: nginx  # 容器的名字
    image: nginx:alpine  # 镜像的名字
    ports:
    - containerPort: 80
    livenessProbe:
      httpGet:
        path: /
        port: 80
      initialDelaySeconds: 3
      periodSeconds: 3

监听TCP端口

livenessProbe
  tcpSocket:
     port: 8080
     initialDelaySeconds: 3
     periodSeconds: 3

综合练习

#default.conf
server {
    listen       80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    location /nginx-status {
        stub_status on;
        access_log  off;
    }
}

#挂载文件并监听
apiVersion: v1
kind: Pod
metadata:  # pod 的源数据信息,可以写多个
  name: nginx-status  # pod 的名字
spec:
  containers:
  - name: nginx  # 容器的名字
    image: nginx:alpine  # 镜像的名字
    ports:
    - containerPort: 80
    volumeMounts:
    - name: nginx
      mountPath: "/etc/nginx/conf.d/default.conf"
      subPath: default.conf
    livenessProbe:
      httpGet:
        path: /nginx-status/
        port: 80
      initialDelaySeconds: 3
      periodSeconds: 3
  volumes:
  - name: nginx
    configMap:
      name: nginx
在宿主机可以通过curl访问得到nginx-status

PodPreset

其作用在于用一个已经编写好的yaml文件填充需要的yaml文件

实例:

# dev.yaml
apiVersion: v1
kind: Pod
metadata:  # pod 的源数据信息,可以写多个
  name: dev # pod 的名字
  labels:
    disktype: ssd
spec:
  containers:
  - name: dev  # 容器的名字
    image: nginx:alpine  # 镜像的名字
    ports:
    - containerPort: 80

#ops.yaml
apiVersion: settings.k8s.io/v1alpha1
kind: PodPreset
metadata:
  name: ops
spec: 
  selector:
    matchLabels:
      disktype: ssd
  volumeMounts:
  - mountPath: /etc/nginx/conf.d/default.conf
    name: nginx
    subPath: default.conf 
  volumes:
    - name: nginx
      configMap:
        name: nginx

本实验的环境: server与client均为v1.16.1版本

值的注意的是:kubenet中PodPerset默认为关闭的。因此,需要自己打开。

vim /etc/kubernetes/manifests/kube-apiserver.yaml
添加下面的行
- --runtime-config=settings.k8s.io/v1alpha1=true

修改下面的行
- --enable-admission-plugins=NodeRestriction,PodPreset
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,340评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,762评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,329评论 0 329
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,678评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,583评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,995评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,493评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,145评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,293评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,250评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,267评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,973评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,556评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,648评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,873评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,257评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,809评论 2 339

推荐阅读更多精彩内容

  • Kubernetes是Google开源的容器集群管理系统,其提供应用部署、维护、 扩展机制等功能,利用Kubern...
    devabel阅读 6,293评论 0 13
  • 一. Pod介绍与容器分类 1.Pod的特性 • 最小部署单元• 一组容器的集合,紧密关联的容器考虑放到一个pod...
    六弦极品阅读 827评论 0 0
  • k8s中最为重要的基础资源,pod,pod controller,servicepod controller类型有...
    stephe_c阅读 2,556评论 0 1
  • 1.Pod Pod是k8s的最基本的操作单元,包含一个或多个紧密相关的容器,类似于豌豆荚的概念。一个Pod可以被一...
    jony456123阅读 7,390评论 0 5
  • 学习本节内容之前,希望你已经对Kubernetes有了初步的概念。具体请参考这篇文章:运行第一个Kubernete...
    伊凡的一天阅读 7,021评论 0 12