目录
上一篇,我们介绍了pod及pod解决了什么问题,本篇将说一下pod的相关配置及简单的例子
一、建立一个简单的pod例子
在没有说yaml语法时,先建立一个简单的Pod,这样会好讲一些,先运行再讲语法
mkdir -p /disk1/k8sConf
cat>/disk1/k8sConf/nginx1.18.yaml<<EOF
apiVersion: v1
#注解这个pod,首字母要大写的哈,要不会创建失败
kind: Pod
metadata:
name: nginx18
labels:
web: nginx1.18
spec:
containers:
- name: nginx18
image: nginx:1.18
ports:
- name: nginx
containerPort: 80
#如果配置这个一台机将无法启用2份副本
hostPort: 82
EOF
cat /disk1/k8sConf/nginx1.18.yaml
#使用kubectl apply这种方式,叫声明式
[root@vm82 ~]# kubectl apply -f /disk1/k8sConf/nginx1.18.yaml
pod/nginx18 created
[root@vm82 ~]# kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx18 1/1 Running 0 23m 10.44.0.1 vm821 <none> <none>
登陆web界面查看结果如下:
再过一会儿就自动变绿色,运行正常了,点进去看一下
发现一个内部IP地址:
#直接看一下内部的80端口看一下,发现成功了
[root@vm82 ~]# curl 10.44.0.1:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
我们再看一下外部端口,外部端口是 节点ip:端口号,我这里只有一个节点,端口号上面配置为82,所以192.168.8.21:82
二、pod yaml格式
我们可以使用yaml格式编写一个pod,如果你不懂写YAML可以看一下阮一峰的《YAML语言教程》
YAML你只记住一个很重要的概念,就是冒号后面一定要加一个空格,层次之间差2个空格,不能用tab键
1.1 pod配置格式
pod配置格式其实可以看k8s官方参考手册API,目前最新版本为v1.18
从上面的nginx18.yaml的pod配置文件,知道YAML怎写的,编写Pod有些属性是性填写的,如下
apiVersion :定义调用的api版本,所支持的版本可以通过kubectl api-resourc
metadata:元数据
这个是API对象的“标识”,它也是我们从 Kubernetes 里找到这个对象的主要依据。这其中最主要使用到的字段是 Labels。顾名思义,Labels 就是一组 key-value 格式的标签。到后面用一像 Deployment 这样的控制器对象,就可以通过这个 Labels 字段从 Kubernetes 中过滤出它所关心的被控制对象
另外,在 Metadata 中,还有一个与 Labels 格式、层级完全相同的字段叫 Annotations,它专门用来携带 key-value 格式的内部信息。所谓内部信息,指的是对这些信息感兴趣的,是 Kubernetes 组件本身,而不是用户。所以大多数 Annotations,都是在 Kubernetes 运行过程中,被自动加在这个 API 对象上。
spec :用于定义用户期望的状态,描述它所要表达的功能,不同的资源类型
status:记录活动对象的当前状态信息,由k8s系统自行维护,对用户来说为
只读字段
PS:一个 Kubernetes 的 API 对象的定义,大多可以分为 Metadata 和 Spec 两个部分。
前者存放的是这个对象的元数据,对所有 API 对象来说,这一部分的字段和格式基本上是一样的;
而后者存放的,则是属于这个对象独有的定义,用来描述它所要表达的功能。
1.2 配置属性
上面是格式,每一个段都有一堆属性,为了方便阅读我放在附录一
如果学习配置可以使用 配置说明命令,如下:
#pod API配置字段查询,你可以清晰地看到我们第三小节提到的pod对象的配置格式
kubectl explain pods
#如果想要知道pod中的spec字段如何配置,可以使用以下命令。
kubectl explain pods.spec
#Docker策略回顾
Docker:
imagePullPolicy:
Always:无论本地有没有镜像,都要去互联网拖(常用于拉取latest的镜像)
Nerver:如果本地没有镜像,就不启动(常用于拉取指定版本的镜像)
IfNotPresent:本地有就直接用,没有再去拖
ps:
你要勤于使用kubectl explain命令,查询相关字段的配置格式、要求等,这是你学好kubernetes配置清单的大宝剑!
1.3 创建pod对象
创建api对象一般有2种方式
命令式:
kubectl create -f yaml配置文件
声明式:推荐
kubectl apply -f yaml配置文件
这里推荐使用声明式,为什么呢,因为apply可以执行多次,对应修改操作,而create只能执行一次,如果yaml配置文件进行修改了,那么你就不能用create了,这样就给运维和开发结合带来方便,实现DevOps。
比如开发修改了东西,运维不知道有没有运行这个配置,是否修改了,无论你做什么修改如果用apply的话,它会自动判断,如果有则进行修改,并实现逐步式更换原来的旧容器。如果没有则创建一个新的。
三、三种网络代理方式
kubernetes中提供了3种方式将集群内的服务暴露到集群外(后面我们会分别使用到): 三种网络代理方式
service:申明NodePort类型,可以通过任意节点访问
hostPort:直接将容器的端口与所调度的节点上的端口路由,这样用户就可以通过宿主机的IP加上来访问Pod了
hostNetwork:共享宿主机的网络名称空间
附录一、pod属性列表