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  

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

2. 指定容器的启动参数

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

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

看似很简单,使用数组的方式定义,所有命令使用跟 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  

参考: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  

这个例子就是用来再应用程序启动前首先从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  

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  

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"]  

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  

即使用一个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  

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

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

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

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

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

二、直接删除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  

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

黑客&网络安全如何学习

今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。

1.学习路线图

攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有问题。

2.视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

内容涵盖了网络安全法学习、网络安全运营等保测评、渗透测试基础、漏洞详解、计算机基础知识等,都是网络安全入门必知必会的学习内容。

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

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

CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

3.技术文档和电子书

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

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

CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

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

“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。

还有我视频里讲的案例源码和对应的工具包,需要的话也可以拿走。

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

CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

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

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

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

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

内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…

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

CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值