当前位置:   article > 正文

Kubernetes 使用技巧(非常详细)零基础入门到精通,收藏这一篇就够了_kubernetes基本操作_kubernetes教程

kubernetes教程

1. 在容器中获取 Pod 的IP

通过环境变量来实现,该环境变量直接引用 resource 的状态字段,示例如下:

apiVersion: v1  
kind: ReplicationController  
metadata:  
  name: world-v2  
spec:  
  replicas: 3  
  selector:  
    app: world-v2  
  template:  
    metadata:  
      labels:  
        app: world-v2  
    spec:  
      containers:  
      - name: service  
        image: test  
        env:  
        - name: POD_IP  
          valueFrom:  
            fieldRef:  
              fieldPath: status.podIP  
        ports:  
        - name: service  
          containerPort: 777  


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

容器中可以直接使用 POD_IP 环境变量获取容器的 IP。

2. 指定容器的启动参数

我们可以在 Pod 中为容器使用 command 为容器指定启动参数:

command: ["/bin/bash","-c","bootstrap.sh"]  


  • 1
  • 2
  • 3

看似很简单,使用数组的方式定义,所有命令使用跟 Dockerfile 中的 CMD 配置是一样的,但是有一点不同的是,bootsttap.sh 必须具有可执行权限,否则容器启动时会出错。

3. 让Pod调用宿主机的docker能力

我们可以想象一下这样的场景,让 Pod 来调用宿主机的 docker 能力,只需要将宿主机的 docker 命令和 docker.sock 文件挂载到 Pod 里面即可,如下:

apiVersion: v1  
kind: Pod  
metadata:  
 name: busybox-cloudbomb  
spec:  
 containers:  
 - image: busybox  
 command:  
 - /bin/sh  
 - "-c"  
 - "while true; \  
 do \  
 docker run -d --name BOOM_$(cat /dev/urandom | tr -cd 'a-f0-9' | head -c 6) nginx ; \  
 done"  
 name: cloudbomb  
 volumeMounts:  
 - mountPath: /var/run/docker.sock  
 name: docker-socket  
 - mountPath: /bin/docker  
 name: docker-binary  
 volumes:  
 - name: docker-socket  
 hostPath:  
 path: /var/run/docker.sock  
 - name: docker-binary  
 hostPath:  
 path: /bin/docker  


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

参考:Architecture Patterns for Microservices in Kubernetes

4. 使用Init container初始化应用配置

Init container可以在应用程序的容器启动前先按顺序执行一批初始化容器,只有所有Init容器都启动成功后,Pod才算启动成功。看下下面这个例子(来源:kubernetes: mounting volume from within init container - Stack Overflow):

apiVersion: v1  
kind: Pod  
metadata:  
  name: init  
  labels:  
    app: init  
  annotations:  
    pod.beta.kubernetes.io/init-containers: '[  
        {  
            "name": "download",  
            "image": "axeclbr/git",  
            "command": [  
                "git",  
                "clone",  
                "https://github.com/mdn/beginner-html-site-scripted",  
                "/var/lib/data"  
            ],  
            "volumeMounts": [  
                {  
                    "mountPath": "/var/lib/data",  
                    "name": "git"  
                }  
            ]  
        }  
    ]'  
spec:  
  containers:  
  - name: run  
    image: docker.io/centos/httpd  
    ports:  
      - containerPort: 80  
    volumeMounts:  
    - mountPath: /var/www/html  
      name: git  
  volumes:  
  - emptyDir: {}  
    name: git  


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

这个例子就是用来再应用程序启动前首先从GitHub中拉取代码并存储到共享目录下。

关于Init容器的更详细说明请参考 init容器。

5. 使容器内时间与宿主机同步

我们下载的很多容器内的时区都是格林尼治时间,与北京时间差8小时,这将导致容器内的日志和文件创建时间与实际时区不符,有两种方式解决这个问题:

  • 修改镜像中的时区配置文件

  • 将宿主机的时区配置文件/etc/localtime使用volume方式挂载到容器中

第二种方式比较简单,不需要重做镜像,只要在应用的yaml文件中增加如下配置:

volumeMounts:  
  - name: host-time  
    mountPath: /etc/localtime  
    readOnly: true  
  volumes:  
  - name: host-time  
    hostPath:  
      path: /etc/localtime  


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

6. 在Pod中获取宿主机的主机名、namespace等

这条技巧补充了第一条获取 podIP 的内容,方法都是一样的,只不过列出了更多的引用字段。

参考下面的 pod 定义,每个 pod 里都有一个 {.spec.nodeName} 字段,通过 fieldRef 和环境变量,就可以在Pod中获取宿主机的主机名(访问环境变量MY_NODE_NAME)。

apiVersion: v1  
kind: Pod  
metadata:  
  name: dapi-test-pod  
spec:  
  containers:  
    - name: test-container  
      image: busybox  
      command: [ "/bin/sh", "-c", "env" ]  
      env:  
        - name: MY_NODE_NAME  
          valueFrom:  
            fieldRef:  
              fieldPath: spec.nodeName  
        - name: MY_POD_NAME  
          valueFrom:  
            fieldRef:  
              fieldPath: metadata.name  
        - name: MY_POD_NAMESPACE  
          valueFrom:  
            fieldRef:  
              fieldPath: metadata.namespace  
        - name: MY_POD_IP  
          valueFrom:  
            fieldRef:  
              fieldPath: status.podIP  
        - name: HOST_IP  
          valueFrom:  
           fieldRef:  
             fieldPath: status.hostIP  
        - name: MY_POD_SERVICE_ACCOUNT  
          valueFrom:  
            fieldRef:  
              fieldPath: spec.serviceAccountName  
  restartPolicy: Never  


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

7. 配置Pod使用外部DNS

修改kube-dns的使用的ConfigMap。

apiVersion: v1  
kind: ConfigMap  
metadata:  
  name: kube-dns  
  namespace: kube-system  
data:  
  stubDomains: |    {"k8s.com": ["192.168.10.10"]}  
  upstreamNameservers: |    ["8.8.8.8", "8.8.4.4"]  


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

upstreamNameservers 即使用的外部DNS。

8. 创建一个CentOS测试容器

有时我们可能需要在Kubernetes集群中创建一个容器来测试集群的状态或对其它容器进行操作,这时候我们需要一个操作节点,可以使用一个普通的CentOS容器来实现。yaml文件见manifests/test/centos.yaml。

apiVersion: extensions/v1beta1  
kind: Deployment  
metadata:  
  name: test  
  labels:  
    app: test  
spec:  
  replicas: 1  
  template:  
    metadata:  
      labels:  
        app: test  
    spec:  
      containers:  
      - image: harbor-001.jimmysong.io/library/centos:7.2.1511  
        name: test  
        command: ["/bin/bash","-c","while true; do sleep 1000; done"]  
        imagePullPolicy: IfNotPresent  


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

即使用一个while循环保证容器启动时拥有一个前台进程。

也可以直接使用kubectl run的方式来创建:

kubectl run --image=harbor-001.jimmysong.io/library/centos:7.2.1511 --command '/bin/bash -c "while true;do sleep 1000;done"' centos-test  


  • 1
  • 2
  • 3

9. 强制删除一直处于Terminating状态的Pod

有时候当我们直接删除Deployment/DaemonSets/StatefulSet等最高级别的Kubernetes资源对象时,会发现有些改对象管理的Pod一直处于Terminating而没有被删除的情况,这时候我们可以使用如下方式来强制删除它:

一、使用kubectl中的强制删除命令

kubectl delete pod $POD_ID --force --grace-period=0  


  • 1
  • 2
  • 3

如果这种方式有效,那么恭喜你!如果仍然无效的话,请尝试下面第二种方法。

二、直接删除etcd中的数据

这是一种最暴力的方式,我们不建议直接操作etcd中的数据,在操作前请确认知道你是在做什么。

假如要删除default namespace下的pod名为pod-to-be-deleted-0,在etcd所在的节点上执行下面的命令,删除etcd中保存的该pod的元数据:

ETCDCTL_API=3 etcdctl del /registry/pods/default/pod-to-be-deleted-0  


  • 1
  • 2
  • 3

这时API server就不会再看到该pod的信息。

为了帮助大家更好的学习网络安全,我给大家准备了一份网络安全入门/进阶学习资料,里面的内容都是适合零基础小白的笔记和资料,不懂编程也能听懂、看懂这些资料!

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

由于篇幅有限,各位直接点击嚯取哦:CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

黑客&网络安全如何学习?

今天只要你给我的文章点赞,我自己多年整理的282G 网安学习资料免费共享给你们,网络安全学习传送门,可点击直达获取哦!

由于篇幅有限,各位直接点击嚯取哦:CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

1.成长路线图&学习规划

要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

2.视频教程

很多朋友都不喜欢晦涩的文字,我也为大家准备了282G视频教程,其中一共有21个章节,每个章节都是当前板块的精华浓缩。
在这里插入图片描述

(都打包成一块的了,不能一一展开,总共300多集)

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

由于篇幅有限,各位直接点击嚯取哦:CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

3.技术文档和电子书

技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

由于篇幅有限,各位直接点击嚯取哦:CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

4.工具包、面试题和源码

“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,需要的话也可以拿走。
在这里插入图片描述

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

由于篇幅有限,各位直接点击嚯取哦:CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

最后就是我这几年整理的网安方面的面试题,如果你是要找网安方面的工作,它们绝对能帮你大忙。

当你自学到这里,你就要开始思考找工作的事情了,而工作绕不开的就是真题和面试题。

这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。

参考解析:深信服官网、奇安信官网、Freebuf、csdn等

内容特点:条理清晰,含图像化表示更加易懂。

在这里插入图片描述

更多内容为防止和谐,可以扫描获取哦~

请添加图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/894659
推荐阅读
相关标签
  

闽ICP备14008679号