zoukankan      html  css  js  c++  java
  • 白话k8s-Pod的组成

    k8s的所有功能都是围绕着Pod进行展开的,我们经常会看到类似这样一张图

    告诉我们,Pod是一组container的集合,container之间可以通过localhost:port的方式直接访问。
    感觉很神奇,明明是不同的container怎么做到共用一个IP的,在随便一个容器内通过localhost访问就能访问其他容器的服务,通过例子和阅读源码找到了原因:

    创建一个简单的Pod

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      labels:
        app: hello-world
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
          - containerPort: 80
    

    create

    kubectl create -f pod1.yaml
    

    查看 pod 信息

    $ kubectl get pod -o wide
    NAME    READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES
    nginx   1/1     Running   0        69s   10.244.1.3   node01   <none>           <none>
    

    在节点上docker ps一下,你会发现,一个Pod的组成:是由一个pause的容器和n个你自定义的容器组成的

    也就是如下图所示这样

    Pod是如何把这些container组成一个的呢?用的是label
    查看containerlable信息
    pauselabel

    nginx的label

    看一下数据, pod.name:"nginx", namespace: "default","pod.uid"都是一样的。k8s就是通过这些label来组织Pod的。

    不使用k8s创建一个Pod

    查看kubernets源码,发现K8s在启动一个Pod的时候,是先启动一个sandbox的容器,然后才再启动用户自定义的容器。

    defaultSandboxImage = "k8s.gcr.io/pause:3.2"
    

    这个sandbox启动的时候会以--ipc="shareable"共享namespace方式启动

    “shareable”	Own private IPC namespace, with a possibility to share it with other containers.
    

    也就是说,一个Pod里所有的容器共享 pause容器的资源,比如namesapce,network,uts...
    我们可以做一个试验不使用k8s,直接使用docker来创建一个自己的Pod
    先启动一个pause,分配一个端口

    docker run -d --name pause --ipc="shareable" -p 9080:8080 k8s.gcr.io/pause:3.1
    

    再启动一个echoserver,会启动一个http服务,监听8080端口。
    共享的pause的各种资源

    docker run -d --name echoserver --net=container:pause --ipc=container:pause --pid=container:pause googlecontainer/echoserver:1.9
    

    我们请求pause容器。

    $ curl http://127.0.0.1:9080 -d "hello"
    
    
    Hostname: d6c76d2b87e5
    
    Pod Information:
    	-no pod information available-
    
    Server values:
    	server_version=nginx: 1.13.3 - lua: 10008
    
    Request Information:
    	client_address=172.17.0.1
    	method=POST
    	real path=/
    	query=
    	request_version=1.1
    	request_scheme=http
    	request_uri=http://127.0.0.1:8080/
    
    Request Headers:
    	accept=*/*
    	content-length=5
    	content-type=application/x-www-form-urlencoded
    	host=127.0.0.1:9080
    	user-agent=curl/7.61.1
    
    Request Body:
    hello
    

    这两个容器就组成了一个简单的pod

  • 相关阅读:
    第01组-Alpha冲刺总结
    pypy windows安装scrapy
    Python:pip无法使用No module named '_sysconfigdata_m_linux_x86_64-linux-gnu'
    Jenkins+Ansible+Gitlab:通过curl自动推送文件&gitlab自动触发构建
    zabbix安装及问题小结
    虚拟机中的jenkins无法访问&Nginx配置
    centos7 安装gitlab及简单配置
    kerberos&LDAP实现免密码登录搭建
    kerberos&ssh 原理、免密登录搭建
    自启动脚本/etc/rc.local文件
  • 原文地址:https://www.cnblogs.com/li-peng/p/13845730.html
Copyright © 2011-2022 走看看