先了解一下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容器本身的设计有关,但是现在肯定是网络出现了问题,像我这样新手排查问题就非常困难了,于是开始下面的踩坑。