目录

一   k8s 支持的语言格式

1,YAML 语法格式

2,查看 api 资源版本标签

二   k8s 运行nginx pod实例  yaml文件 具体讲解

1,写一个yaml文件demo

2,deployment 管理nginx 的yaml 文件

3,创建资源对象

4,查看创建的pod资源

5,创建service服务对外提供访问并测试

6,创建service资源对象

7,查看创建的service

8,验证结果

三   快速写yaml 文件方法

1,用 --dry-run 命令 创建但不执行

2,  查看生成yaml格式

3,  查看生成json格式

4,  使用yaml格式导出生成模板

5,  将现有的资源生成模板导出

6,  保存到文件中

7,  查看字段帮助信息,可一层层的查看相关资源对象的帮助信息

四    实战演练

1,用yaml 文件  k8s 运行nginx的pod实例

1.1 实验需求

1.2 创建命名空间

1.3 创建pod 实例

1.4 创建service

1.5  修改得到的yaml 文件

1.6  执行yaml 文件

1.7  查看结果

1.8 进容器 做页面

1.9 访问 nginx

2,  用yaml 文件  k8s 运行redis的pod实例 (指定暴露端口)

2.1 用deployment 控制器创造 redis 实例

2.2 暴露端口

2.3 修改yaml 文件

2.4  执行yaml 文件

2.5 访问 redis

3, 用yaml 文件  k8s 运行mysql 的pod实例

3.1 报错分析

3.2 查看pod 日志

3.3 解决办法

 或者

3.4  修改yaml 文件

3.5 执行yaml 文件

3.6 进入mysql 的容器,用root 登录


一   k8s 支持的语言格式

Kubernetes 支持 YAML 和 JSON 格式管理资源对象
JSON 格式:主要用于 api 接口之间消息的传递
YAML 格式:用于配置和管理,YAML 是一种简洁的非标记性语言,内容格式人性化,较易读
 

1,YAML 语法格式

●大小写敏感
●使用缩进表示层级关系
●不支持Tab键制表符缩进,只使用空格缩进
●缩进的空格数目不重要,只要相同层级的元素左侧对齐即可,通常开头缩进两个空格
●符号字符后缩进一个空格,如冒号,逗号,短横杆(-)等
●“---”表示YAML格式,一个文件的开始,用于分隔文件间
●“#”表示注释
 

2,查看 api 资源版本标签

kubectl api-versions 命令帮助用户了解其 Kubernetes 集群所支持的 API 资源及版本范围,是管理和操作集群时的一个有用的信息参考点。

kubectl api-versions

如果是业务场景一般首选使用 apps/v1
带有beta字样的代表的是测试版本,不用在生产环境中

二   k8s 运行nginx pod实例  yaml文件 具体讲解

1,写一个yaml文件demo

mkdir /opt/demo
cd demo/

vim nginx-deployment.yaml

 

2,deployment 管理nginx 的yaml 文件

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,创建资源对象

kubectl create -f nginx-deployment.yaml

4,查看创建的pod资源

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服务对外提供访问并测试

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资源对象

kubectl create -f nginx-service.yaml 

7,查看创建的service

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 即可访问

http://192.168.80.11:35680
http://192.168.80.12:35680

三   快速写yaml 文件方法

1,用 --dry-run 命令 创建但不执行

创建自主状态pod

kubectl run nginx-test --image=nginx --port=80 --dry-run=client

创建无状态pod

kubectl create deployment nginx-deploy --image=nginx --port=80 --replicas=3 --dry-run=client

2,  查看生成yaml格式

自主状态pod

kubectl run nginx-test --image=nginx --port=80 --dry-run=client -o yaml

无状态pod

kubectl create deployment nginx-deploy --image=nginx --port=80 --replicas=3 --dry-run=client -o yaml

3,  查看生成json格式

自主状态pod

kubectl run nginx-test --image=nginx --port=80 --dry-run=client -o json

无状态pod

kubectl create deployment nginx-deploy --image=nginx --port=80 --replicas=3 --dry-run=client -o json

4,  使用yaml格式导出生成模板

并进行修改以及删除一些不必要的参数

自主状态pod

kubectl run nginx-test --image=nginx --port=80 --dry-run=client -o yaml > nginx-test.yaml

无状态pod

kubectl create deployment nginx-deploy --image=nginx --port=80 --replicas=3 --dry-run=client -o yaml  > nginx-deploy.yaml

5,  将现有的资源生成模板导出

kubectl get svc nginx-service -o yaml

6,  保存到文件中

kubectl get svc nginx-service -o yaml > my-svc.yaml

7,  查看字段帮助信息,可一层层的查看相关资源对象的帮助信息

这个很重要,比如不知道deployment 的yaml 文件怎么写,可以输入 kubectl explain deployment

下面会提示你需要哪些信息

kubectl explain deployments.spec.template.spec.containers


或
kubectl explain pods.spec.containers

四    实战演练

1,用yaml 文件  k8s 运行nginx的pod实例

1.1 实验需求

1.2 创建命名空间
kubectl create ns my-ky35 --dry-run=client -o yaml  >nginx.yaml

1.3 创建pod 实例
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
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 文件
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 文件
kubectl apply -f nginx.yaml 

1.7  查看结果

1.8 进容器 做页面
kubectl exec -it  my-nginx-ky35 -n my-ky35 bash

1.9 访问 nginx

2,  用yaml 文件  k8s 运行redis的pod实例 (指定暴露端口)

2.1 用deployment 控制器创造 redis 实例
kubectl create deployment my-redis-wyq --image=redis:latest  --port=6379  --dry-run=client  -n my-ky35 -o yaml  >> redis.yaml 

2.2 暴露端口
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   指定暴露端口

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 文件
kubectl apply -f redis.yaml

2.5 访问 redis

连接redis  测试

3, 用yaml 文件  k8s 运行mysql 的pod实例

3.1 报错分析

和上述步骤一样时会报错。报错如下:

CrashLoopBackOff 是 Kubernetes 中的一个状态,表明 Pod 内的容器反复启动后立即退出(崩溃),然后 Kubernetes 会按照重启策略(通常默认是重启)不断地尝试重新启动容器。这种状况通常是由于容器内的应用运行时出现错误,导致进程非正常终止。 

3.2 查看pod 日志

在master01 

查看日志

kubectl logs my-mysql-wyq-99f66bcc-dbjvf -n my-ky35

 

因为 MySQL 服务容器在启动时遇到问题,因为它发现数据库还没有被初始化,并且您没有提供必要的环境变量来设定 root 用户的密码。MySQL 容器要求在首次启动时明确指定关于 root 密码的处理方式 

3.3 解决办法

可以通过设置 MYSQL_ROOT_PASSWORD 环境变量来指定 root 用户的密码

env:
- name: MYSQL_ROOT_PASSWORD
  value: "your_strong_password_here"
 或者

允许 root 用户密码为空

env:
- name: MYSQL_ALLOW_EMPTY_PASSWORD
  value: "yes"

3.4  修改yaml 文件

要修改的地方:

允许mysql 的root 密码为空

代码展示如下:

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 账户登录

Logo

一起探索未来云端世界的核心,云原生技术专区带您领略创新、高效和可扩展的云计算解决方案,引领您在数字化时代的成功之路。

更多推荐