目录
[一 k8s 支持的语言格式](#一 k8s 支持的语言格式)
[1,YAML 语法格式](#1,YAML 语法格式)
[2,查看 api 资源版本标签](#2,查看 api 资源版本标签)
[二 k8s 运行nginx pod实例 yaml文件 具体讲解](#二 k8s 运行nginx pod实例 yaml文件 具体讲解)
[2,deployment 管理nginx 的yaml 文件](#2,deployment 管理nginx 的yaml 文件)
[三 快速写yaml 文件方法](#三 快速写yaml 文件方法)
[1,用 --dry-run 命令 创建但不执行](#1,用 --dry-run 命令 创建但不执行)
[2, 查看生成yaml格式](#2, 查看生成yaml格式)
[3, 查看生成json格式](#3, 查看生成json格式)
[4, 使用yaml格式导出生成模板](#4, 使用yaml格式导出生成模板)
[5, 将现有的资源生成模板导出](#5, 将现有的资源生成模板导出)
[6, 保存到文件中](#6, 保存到文件中)
[7, 查看字段帮助信息,可一层层的查看相关资源对象的帮助信息](#7, 查看字段帮助信息,可一层层的查看相关资源对象的帮助信息)
[四 实战演练](#四 实战演练)
[1,用yaml 文件 k8s 运行nginx的pod实例](#1,用yaml 文件 k8s 运行nginx的pod实例)
[1.1 实验需求](#1.1 实验需求)
[1.2 创建命名空间](#1.2 创建命名空间)
[1.3 创建pod 实例](#1.3 创建pod 实例)
[1.4 创建service](#1.4 创建service)
[1.5 修改得到的yaml 文件](#1.5 修改得到的yaml 文件)
[1.6 执行yaml 文件](#1.6 执行yaml 文件)
[1.7 查看结果](#1.7 查看结果)
[1.8 进容器 做页面](#1.8 进容器 做页面)
[1.9 访问 nginx](#1.9 访问 nginx)
[2, 用yaml 文件 k8s 运行redis的pod实例 (指定暴露端口)](#2, 用yaml 文件 k8s 运行redis的pod实例 (指定暴露端口))
[2.1 用deployment 控制器创造 redis 实例](#2.1 用deployment 控制器创造 redis 实例)
[2.2 暴露端口](#2.2 暴露端口)
[2.3 修改yaml 文件](#2.3 修改yaml 文件)
[2.4 执行yaml 文件](#2.4 执行yaml 文件)
[2.5 访问 redis](#2.5 访问 redis)
[3, 用yaml 文件 k8s 运行mysql 的pod实例](#3, 用yaml 文件 k8s 运行mysql 的pod实例)
[3.1 报错分析](#3.1 报错分析)
[3.2 查看pod 日志](#3.2 查看pod 日志)
[3.3 解决办法](#3.3 解决办法)
[3.4 修改yaml 文件](#3.4 修改yaml 文件)
[3.5 执行yaml 文件](#3.5 执行yaml 文件)
[3.6 进入mysql 的容器,用root 登录](#3.6 进入mysql 的容器,用root 登录)
一 k8s 支持的语言格式
Kubernetes 支持 YAML 和 JSON 格式管理资源对象
JSON 格式:主要用于 api 接口之间消息的传递
YAML 格式:用于配置和管理,YAML 是一种简洁的非标记性语言,内容格式人性化,较易读
1,YAML 语法格式
●大小写敏感
●使用缩进表示层级关系
●不支持Tab键制表符缩进,只使用空格缩进
●缩进的空格数目不重要,只要相同层级的元素左侧对齐即可,通常开头缩进两个空格
●符号字符后缩进一个空格,如冒号,逗号,短横杆(-)等
●"---"表示YAML格式,一个文件的开始,用于分隔文件间
●"#"表示注释
2,查看 api 资源版本标签
kubectl api-versions
命令帮助用户了解其 Kubernetes 集群所支持的 API 资源及版本范围,是管理和操作集群时的一个有用的信息参考点。
bash
kubectl api-versions
如果是业务场景一般首选使用 apps/v1
带有beta字样的代表的是测试版本,不用在生产环境中
二 k8s 运行nginx pod实例 yaml文件 具体讲解
1,写一个yaml文件demo
bash
mkdir /opt/demo
cd demo/
vim nginx-deployment.yaml
2,deployment 管理nginx 的yaml 文件
bash
apiVersion: apps/v1 #指定api版本标签
kind: Deployment #定义资源的类型/角色,deployment为副本控制器,此处资源类型可以是Deployment、Job、Ingress、Service等
metadata: #定义资源的元数据信息,比如资源的名称、namespace、标签等信息
name: nginx-deployment #定义资源的名称,在同一个namespace空间中必须是唯一的
labels: #定义Deployment资源标签
app: nginx
spec: #定义deployment资源需要的参数属性,诸如是否在容器失败时重新启动容器的属性
replicas: 3 #定义副本数量
selector: #定义标签选择器
matchLabels: #定义匹配标签
app: nginx #需与 .spec.template.metadata.labels 定义的标签保持一致
template: #定义业务模板,如果有多个副本,所有副本的属性会按照模板的相关配置进行匹配
metadata:
labels: #定义Pod副本将使用的标签,需与 .spec.selector.matchLabels 定义的标签保持一致
app: nginx
spec:
containers: #定义容器属性
- name: nginx #定义一个容器名,一个 - name: 定义一个容器
image: nginx:1.15.4 #定义容器使用的镜像以及版本
ports:
- containerPort: 80 #定义容器的对外的端口
详解k8s中的port:
●port
port 是 k8s 集群内部访问service的端口,即通过 clusterIP: port 可以从 Pod 所在的 Node 上访问到 service
●nodePort
nodePort 是外部访问 k8s 集群中 service 的端口,通过 nodeIP: nodePort 可以从外部访问到某个 service。
●targetPort
targetPort 是 Pod 的端口,从 port 或 nodePort 来的流量经过 kube-proxy 反向代理负载均衡转发到后端 Pod 的 targetPort 上,最后进入容器。
●containerPort
containerPort 是 Pod 内部容器的端口,targetPort 映射到 containerPort。
即我要指定暴露nginx的端口,就在yaml 文件中指定nodeport
3,创建资源对象
bash
kubectl create -f nginx-deployment.yaml
4,查看创建的pod资源
bash
kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
nginx-deployment-d55b94fd-29qk2 1/1 Running 0 7m9s 172.17.36.4 192.168.80.12 <none>
nginx-deployment-d55b94fd-9j42r 1/1 Running 0 7m9s 172.17.36.3 192.168.80.12 <none>
nginx-deployment-d55b94fd-ksl6l 1/1 Running 0 7m9s 172.17.26.3 192.168.80.11 <none>
5,创建service服务对外提供访问并测试
bash
vim nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
labels:
app: nginx
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
selector:
app: nginx
6,创建service资源对象
bash
kubectl create -f nginx-service.yaml
7,查看创建的service
bash
kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 16d
nginx-service NodePort 10.0.0.119 <none> 80:35680/TCP 14s
8,验证结果
在浏览器输入 nodeIP:nodePort 即可访问
bash
http://192.168.80.11:35680
http://192.168.80.12:35680
三 快速写yaml 文件方法
1,用 --dry-run 命令 创建但不执行
创建自主状态pod
bash
kubectl run nginx-test --image=nginx --port=80 --dry-run=client
创建无状态pod
bash
kubectl create deployment nginx-deploy --image=nginx --port=80 --replicas=3 --dry-run=client
2, 查看生成yaml格式
自主状态pod
bash
kubectl run nginx-test --image=nginx --port=80 --dry-run=client -o yaml
无状态pod
bash
kubectl create deployment nginx-deploy --image=nginx --port=80 --replicas=3 --dry-run=client -o yaml
3, 查看生成json格式
自主状态pod
bash
kubectl run nginx-test --image=nginx --port=80 --dry-run=client -o json
无状态pod
bash
kubectl create deployment nginx-deploy --image=nginx --port=80 --replicas=3 --dry-run=client -o json
4, 使用yaml格式导出生成模板
并进行修改以及删除一些不必要的参数
自主状态pod
bash
kubectl run nginx-test --image=nginx --port=80 --dry-run=client -o yaml > nginx-test.yaml
无状态pod
bash
kubectl create deployment nginx-deploy --image=nginx --port=80 --replicas=3 --dry-run=client -o yaml > nginx-deploy.yaml
5, 将现有的资源生成模板导出
bash
kubectl get svc nginx-service -o yaml
6, 保存到文件中
bash
kubectl get svc nginx-service -o yaml > my-svc.yaml
7, 查看字段帮助信息,可一层层的查看相关资源对象的帮助信息
这个很重要,比如不知道deployment 的yaml 文件怎么写,可以输入 kubectl explain deployment
下面会提示你需要哪些信息
bash
kubectl explain deployments.spec.template.spec.containers
或
kubectl explain pods.spec.containers
四 实战演练
1,用yaml 文件 k8s 运行nginx的pod实例
1.1 实验需求
1.2 创建命名空间
bash
kubectl create ns my-ky35 --dry-run=client -o yaml >nginx.yaml
1.3 创建pod 实例
bash
kubectl run my-nginx-ky35 --image=nginx:1.14 --port=80 --labels=njzb=my-ky35 --dry-run=client -n my-ky35 -o yaml >> nginx.yaml
1.4 创建service
bash
kubectl expose pod my-nginx-ky35 --port=80 --target-port=80 --name=nginx01 --type=NodePort --dry-run=client -n my-ky35 -o yaml >>nginx.yaml
tips: 此步骤 要先有命令空间 和 pod 实例
此步骤只是要 暴露端口的yaml语言
1.5 修改得到的yaml 文件
bash
apiVersion: v1
kind: Namespace
metadata:
creationTimestamp: null
name: my-ky35
spec: {}
status: {}
---
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
njzb: my-ky35
name: my-nginx-ky35
namespace: my-ky35
spec:
containers:
- image: nginx:1.14
name: my-nginx-ky35
ports:
- containerPort: 80
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
---
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
njzb: my-ky35
name: nginx01
namespace: my-ky35
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
njzb: my-ky35
type: NodePort
status:
loadBalancer: {}
tips:
1.6 执行yaml 文件
bash
kubectl apply -f nginx.yaml
1.7 查看结果
1.8 进容器 做页面
bash
kubectl exec -it my-nginx-ky35 -n my-ky35 bash
1.9 访问 nginx
2, 用yaml 文件 k8s 运行redis的pod实例 (指定暴露端口)
2.1 用deployment 控制器创造 redis 实例
bash
kubectl create deployment my-redis-wyq --image=redis:latest --port=6379 --dry-run=client -n my-ky35 -o yaml >> redis.yaml
2.2 暴露端口
bash
kubectl expose deployment my-redis-wyq --port=6379 --target-port=6379 --name=redis01 --type=NodePort --dry-run=client -n my-ky35 -o yaml >>redis.yaml
注意:这边是创造的deployment
所以不论暴露端口还是 删除 都是指定deployment 名字
2.3 修改yaml 文件
在两个apiVersion: apps/v1 中间加 ---
在暴露端口的那段yaml 文件 指定命名空间
添加nodeport 指定暴露端口
bash
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: my-redis-wyq
name: my-redis-wyq
namespace: my-ky35
spec:
replicas: 1
selector:
matchLabels:
app: my-redis-wyq
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: my-redis-wyq
spec:
containers:
- image: redis:latest
name: redis
ports:
- containerPort: 6379
resources: {}
status: {}
---
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: my-redis-wyq
name: redis01
namespace: my-ky35
spec:
ports:
- port: 6379
protocol: TCP
nodePort: 32333
targetPort: 6379
selector:
app: my-redis-wyq
type: NodePort
status:
loadBalancer: {}
2.4 执行yaml 文件
bash
kubectl apply -f redis.yaml
2.5 访问 redis
连接redis 测试
3, 用yaml 文件 k8s 运行mysql 的pod实例
3.1 报错分析
和上述步骤一样时会报错。报错如下:
CrashLoopBackOff
是 Kubernetes 中的一个状态,表明 Pod 内的容器反复启动后立即退出(崩溃),然后 Kubernetes 会按照重启策略(通常默认是重启)不断地尝试重新启动容器。这种状况通常是由于容器内的应用运行时出现错误,导致进程非正常终止。
3.2 查看pod 日志
在master01
查看日志
bash
kubectl logs my-mysql-wyq-99f66bcc-dbjvf -n my-ky35
因为 MySQL 服务容器在启动时遇到问题,因为它发现数据库还没有被初始化,并且您没有提供必要的环境变量来设定 root 用户的密码。MySQL 容器要求在首次启动时明确指定关于 root 密码的处理方式
3.3 解决办法
可以通过设置 MYSQL_ROOT_PASSWORD
环境变量来指定 root 用户的密码
bash
env:
- name: MYSQL_ROOT_PASSWORD
value: "your_strong_password_here"
或者
允许 root 用户密码为空
bash
env:
- name: MYSQL_ALLOW_EMPTY_PASSWORD
value: "yes"
3.4 修改yaml 文件
要修改的地方:
允许mysql 的root 密码为空
代码展示如下:
bash
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: my-mysql-wyq
name: my-mysql-wyq
namespace: my-ky35
spec:
replicas: 1
selector:
matchLabels:
app: my-mysql-wyq
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: my-mysql-wyq
spec:
containers:
- image: mysql:latest
name: mysql
ports:
- containerPort: 3306
resources: {}
env:
- name: MYSQL_ALLOW_EMPTY_PASSWORD
value: "yes"
status: {}
---
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: my-mysql-wyq
name: mysql01
namespace: my-ky35
spec:
ports:
- port: 3306
nodePort: 31111
protocol: TCP
targetPort: 3306
selector:
app: my-mysql-wyq
type: NodePort
status:
loadBalancer: {}
3.5 执行yaml 文件
3.6 进入mysql 的容器,用root 登录
mysql 准备好了
进入该pod
使用root 账户登录