目录
[K8S集群外部:客户端------nodeIP:nodeport------通过target port------podIP:containerport](#K8S集群外部:客户端——nodeIP:nodeport——通过target port——podIP:containerport)
案例:自主式创建service并关联上面的pod
资源名称:my-nginx-kkk
命名空间:my-kkk
容器镜像:nginx:1.21
容器端口:80
标签:njzb: my-kkk
创建 server去关联上面的pod
结果:首先修改页面:tian wai lai wu,对外访问,输入地址就能访问
1. 试创建文件获取模板文件
kubectl create ns my-kkk --dry-run -oyaml
kubectl run my-nginx-kkk --image=nginx:1.21 --port=80 --dry-run -oyaml > pod.yaml
- 编写yaml文件
kubectl get svc
kubectl get svc nginx -oyaml
vim pod.yaml
kubectl apply -f pod.yaml
kubectl get svc,pod -n my-kkk
将获取的yaml资源内容复制过来,进行修改
vim pod.yaml
apiVersion: v1
kind: Namespace
metadata:
name: my-kkk
---
apiVersion: v1
kind: Pod
metadata:
labels:
njzb: my-kkk
name: my-nginx-kkk
namespace: my-kkk
spec:
containers:
- image: nginx:1.21
name: my-nginx-kkk
ports:
- containerPort: 80
restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
labels:
njzb: my-kkk
name: my-nginx-kkk
namespace: my-kkk
spec:
ports:
- nodePort: 31111 ###节点端口号
port: 80 ###服务暴露端口
protocol: TCP ###通信协议
targetPort: 80 ###要转发到的容器端口
selector:
njzb: my-kkk ###该服务所选择的后端pod
type: NodePort
3. 测试结果
案例:部署redis
[root@master01 demo]# vim redis.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis-dpm
labels:
app: redis
spec: ###资源所需参数
replicas: 1
selector:
matchLabels:
app: redis ###只会与标签app:redis的pod关联
template: ###业务模板,如果有多个副本,所有副本属性会按照模板进行匹配
metadata:
labels:
app: redis
spec: ###资源所需参数
containers:
- name: redis
image: redis:latest
ports:
- containerPort: 6379
---
apiVersion: v1
kind: Service
metadata:
name: redis-dbm
labels:
app: redis
spec:
selector:
app: redis
ports:
- nodePort: 32379
port: 6379
protocol: TCP
targetPort: 6379
type: NodePort
[root@master01 home]# kubectl get svc,pod
案例:部署myapp
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-kk
namespace: default
labels:
app: myapp
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: soscscs/myapp:v1
ports:
- containerPort: 80
案例:部署MySQL数据库
apiVersion: v1
kind: Namespace
metadata:
name: mysql-server
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: mysql-01
name: mysql-01
namespace: mysql-server
spec:
replicas: 1
selector:
matchLabels:
app: mysql-01
template:
metadata:
labels:
app: mysql-01
spec:
containers:
- image: mysql:latest
name: mysql
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "123123"
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
volumes:
- name: mysql-data
emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
name: mysql-service
namespace: mysql-server
labels:
app: mysql-01
spec:
type: NodePort
ports:
- port: 3306
targetPort: 3306
selector:
app: mysql-01
注释版
[root@master01 demo]# cat mysql.yaml
apiVersion: v1 # Kubernetes API 的版本
kind: Namespace # 定义了一个 Namespace
metadata: # 包含了资源的元数据,比如名称、标签等
name: mysql-server # Namespace 的名称
--- # 这个分隔符表示 YAML 文件中的两个资源定义之间的分隔
apiVersion: apps/v1
kind: Deployment # 指定了资源类型为 Deploymen
metadata: # 包含了 Deployment 的元数据,比如名称、标签等
labels: # Deployment 的标签,用于标识和选择相关的资源
app: mysql-01
name: mysql-01 # Deployment 的名称
namespace: mysql-server # Deployment 所属的 Namespace
spec: # 定义了 Deployment 的规格,包括副本数量、选择器和 Pod 模板
replicas: 1 # Deployment 的副本数量
selector: # 定义了用于选择 Pod 的标签
matchLabels: # 这是选择器的标签,与 Pod 模板中的标签匹配
app: mysql-01
template: # 定义了要创建的 Pod 的模板
metadata: # 包含了 Pod 模板的元数据,比如标签等
labels: # Pod 模板的标签,用于标识和选择相关的资源
app: mysql-01
spec: # 定义了 Pod 的规格,包括容器和端口
containers:
- image: mysql:latest # 容器的镜像,使用的是最新版本的 MySQL 镜像
name: mysql # 容器的名称
ports: # 容器的端口列表
- containerPort: 3306 # 容器的端口
env: # 定义环境变量列表
- name: MYSQL_ROOT_PASSWORD # 环境变量的名称
value: "123123" # 设置MySQL的root密码,也就是环境变量的值
# 当MySQL容器首次启动时,它会检查数据库是否已经初始化,并且如果没有提供密码相关的环境变量,它会报错并退出
volumeMounts: # 定义如何挂载卷到容器中
- name: mysql-data # 引用的卷的名称
mountPath: /var/lib/mysql # 卷在容器中的挂载路径
volumes: # 定义Pod中使用的卷列表
- name: mysql-data # 卷的名称,与volumeMounts中的name相对应
emptyDir: {}
# 一个空目录卷。这种类型的卷在Pod首次被调度到节点上时创建,并在Pod被删除时销毁。它不持久化数据,仅用于临时存储
apiVersion: v1
kind: Service # 定义了一个 Service(服务)
metadata: # 包含了服务的元数据,比如名称、标签等
name: mysql-service # 服务的名称
namespace: mysql-server # 服务所属的 Namespace
labels: # 服务的标签,用于标识和选择相关的资源
app: mysql-01 # 服务的标签,与 Deployment 或 Pod 的标签匹配
spec: # 定义了服务的规格,包括服务类型、端口和选择器
type: NodePort # 服务的类型,被设置为 NodePort
ports: # 服务的端口列表
- port: 3306 # 服务的端口
targetPort: 3306 # 服务转发请求的目标端口
selector: # 定义了用于选择后端 Pod 的标签
app: mysql-01 # 选择器的标签,与 Deployment 或 Pod 的标签匹配
[root@master01 demo]# vim mysql.yaml
[root@master01 demo]# kubectl apply -f mysql.yaml
kubectl get pod,svc -n mysql-server -owide
总结
1.K8S集群中访问流向
port:为service在clusterIP上暴露的端口
targetport:对应容器映射在pod上的端口
nodeport:可以通过在K8S集群外部使用nodeIP+nodePort来去访问service
containerport:容器内部使用的端口
K8S集群内部:客户端------clusterIP:port------通过target port------podIP:containerport
K8S集群外部:客户端------nodeIP:nodeport------通过target port------podIP:containerport
2.语法格式
通过缩进表示层级关系
不能使用tab进行缩进,只能使用空格,一般开头缩进2个空格
字符后缩进一个空格,比如冒号,逗号等
使用---表示新的yaml文件的开始
使用#表示注释
3.yaml文件组成部署
(1)控制器定义
deployment:定义metadaea、spec、selector
通过yaml完成副本的定义,自主式的
(2)被控制对象
由哪一个控制器(自主式、deployment、statusfulset等)
4.常用字段的含义
如何快速编写yaml
(1)第一种使用kubectl create 命令生成yaml文件
(2)第二种使用kubectl get 命令导出yaml文件