k8s-pod-初探1

先了解一下namespace

namespace

可以这样理解namespace,把namespace类比成文件夹,pod就是放在文件夹中的一种文件,在文件夹中还可以放置其他类型的文件,如service、deployment等。

下面正式介绍pod,pod是k8s管理的最小单位,非常重要,我感觉掌握好pod的知识,其他概念就水到渠成了。

pod

Pod 是可以在 Kubernetes中创建和管理的、最小的可部署的计算单元,是Kubernetes中最重要的内容。

Pod 是一组(一个或多个)容器;这些容器共享存储、网络,并且一同调度,在共享的上下文中运行,紧密的耦合在一起的。

创建一个简单的pod

yaml语法简介

k8s配置文件使用yaml语法,在写一个pod配置之前,先了解一下yaml语法。

YAML语法规则:

大小写敏感
使用缩进表示层级关系,缩进时不允许使用Tal键,只允许使用空格,缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
”#” 表示注释,从这个字符一直到行尾,都会被解析器忽略  
在Kubernetes中,只需要知道两种结构类型即可:Lists、Maps

yaml文件可以转化为json格式,两者对比来看,会比较清晰

apiVersion: v1
kind: Pod
metadata:
  name: kube100-site
  labels:
    app: web
spec:
  containers:
    - name: front-end
      image: nginx
      ports:
        - containerPort: 80
    - name: flaskapp-demo
      image: jcdemo/flaskapp
      ports: 8080

如上述文件所示,定义一个containers的List对象,每个子项都由name、image、ports组成,每个ports都有一个KEY为containerPort的Map组成,转成JSON格式文件:

{
  "apiVersion": "v1",
  "kind": "Pod",
  "metadata": {
        "name": "kube100-site",
        "labels": {
            "app": "web"
        },
 
  },
  "spec": {
        "containers": [{
            "name": "front-end",
            "image": "nginx",
            "ports": [{
                "containerPort": "80"
            }]
        }, {
            "name": "flaskapp-demo",
            "image": "jcdemo/flaskapp",
            "ports": [{
                "containerPort": "5000"
            }]
        }]
  }
}

pod配置文件

命名为 nginx.yml

apiVersion: v1  #必选,版本号,例如v1
kind: Pod       #必选,Pod
metadata:       #必选,元数据
  name: mynginx        #必选,Pod名称----name1
  labels:              #自定义标签
    name: mynginx      #自定义标签名字----name2
    app: mynginx
  annotations:         #自定义注释
    name: mynginx      #自定义注释名字----name3
    app: mynginx
spec:                  #必选,Pod中容器的详细定义
  containers:          #必选,Pod中容器列表
    - name: nginx      #必选,容器名称----name4
      image: nginx:1.20.0    #必选,容器的镜像名称

看上面的配置文件中共出现了4次 name ,对于初学者来说这些字段容易搞混。

name1:所创建的pod的名字,key必须是name,value可以是任意值,比如改成 name: yournginx

name2:其中一个标签的key,key和value都可以任意修改,比如改成 app: nginx也是可以的

name3:其中一个注释的key,key和value都可以任意修改,比如改成 today: sunday也是可以的

name4:容器名称,key必须是name,value可以是任意值,比如改成 name: yournginx

启动命令

kubectl create -f nginx.yml

也可以用

kubectl apply -f nginx.yml

官方文档上说kubectl apply是对资源进行修改,但实际也可以用来创建资源,官方也给出了使用apply创建资源的例子,所以放心使用。

kubectl apply -f FILENAME [flags]          从文件或 stdin 对资源进行修改
kubectl create -f FILENAME [flags]         从文件或 stdin 创建一个或多个资源

可以用kubectl get pod -o wide 命令来查看pod是否创建成功。

[root@brdev1 ~]# kubectl get pod -o wide
NAME      READY   STATUS    RESTARTS   AGE     IP             NODE          NOMINATED NODE   READINESS GATES
mynginx   1/1     Running   0          3h14m   10.19.130.66   devhost2            <none>           <none>

现在,我们已经运行了一个名为mynginx的pod,ip地址是10.19.130.66,然后尝试去访问这个nginx服务

curl 10.19.130.66:80

预测:根据我之前的学习新的,应该是访问不到的,因为我再pod的yaml文件中没有把端口暴露出来

结果:有的主机能访问到,有的主机不能访问。这个结果与我的预测不仅相反,而且非常奇怪。如果全部能访问,那也能说明端口暴露于docker容器本身的设计有关,但是现在肯定是网络出现了问题,像我这样新手排查问题就非常困难了,于是开始下面的踩坑。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容