Service mesh 学习04 Kubernetes组件回顾
  dBFTbkVLMBge 2023年11月02日 57 0
k8s

一、deployment

pod版本管理工具

一旦运行了 Kubernetes 集群,就可以在其上部署容器化应用程序。 为此,需要创建 Kubernetes Deployment 配置。

Deployment 负责 Kubernetes 如何创建和更新应用程序的实例。

创建 Deployment 后,Kubernetes master 将应用程序实例调度到集群中的各个节点上。

创建nginx_deployment.yaml文件

apiVersion: apps/v1 ## 定义了一个版本
kind: Deployment ##k8s资源类型是Deployment
metadata: ## metadata这个KEY对应的值为一个Maps
  name: nginx-deployment ##资源名字 nginx-deployment
  labels: ##将新建的Pod附加Label
    app: nginx ##一个键值对为key=app,valuen=ginx的Label。
spec: #以下其实就是replicaSet的配置
  replicas: 3 ##副本数为3个,也就是有3个pod
  selector: ##匹配具有同一个label属性的pod标签
    matchLabels: ##寻找合适的label,一个键值对为key=app,value=nginx的Labe
      app: nginx
  template: #模板
    metadata:
      labels: ##将新建的Pod附加Label
        app: nginx
    spec:
      containers:  ##定义容器
      - name: nginx ##容器名称
        image: nginx:1.7.9 ##镜像地址
        ports:
        - containerPort: 80 ##容器端口

执行命令

kubectl apply -f nginx_deployment.yaml

Service mesh 学习04 Kubernetes组件回顾_k8s

查看pod

kubectl get pods

Service mesh 学习04 Kubernetes组件回顾_k8s_02

查看pod详情

kubectl get pods -o wide

Service mesh 学习04 Kubernetes组件回顾_k8s_03

查看deployment

kubectl get deployment -o wide

Service mesh 学习04 Kubernetes组件回顾_k8s_04

二、labels和selector

labels 当资源很多的时候可以用可以用labels标签来对资源分类

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
 
 # 表示名称为nginx-pod的pod,有一个label,key为app,value为nginx。
 #我们可以将具有同一个label的pod,交给selector管理

selectors 如果我想使用这个标签里面的k8s资源,那么需要用到k8s里面selector组件,用selector来匹配到特定的的label

apiVersion: apps/v1
kind: Deployment
metadata: 
  name: nginx-deployment
  labels:  # 定义了一个labels,key=app,value=nginx
    app: nginx
spec:
  replicas: 3
  selector:             # 用selector匹配具有同一个label属性的pod标签
    matchLabels:
      app: nginx

查看pod的label标签命令

kubectl get pods --show-labels

Service mesh 学习04 Kubernetes组件回顾_k8s_05

三、Namespace命名空间

命名空间就是为了隔离不同的资源。比如:Pod、Service、Deployment等。可以在输入命令的时候指定命名空间-n,如果不指定,则使用默认的命名空间:default

查看一下当前的所用命名空间:kubectl get namespaces/ns

查看一下kube-system命名空间:kubectl get pods -n kube-system

Service mesh 学习04 Kubernetes组件回顾_k8s_06

创建自己的命名空间

vi my-namespace.yaml

apiVersion: v1
kind: Namespace
metadata:
    name: myns

kubectl apply -f my-namespace.yaml

Service mesh 学习04 Kubernetes组件回顾_k8s_07

查看命令kubectl get ns

Service mesh 学习04 Kubernetes组件回顾_k8s_08

删除命名空间 kubectl delete namespaces myns

Service mesh 学习04 Kubernetes组件回顾_k8s_09

四、服务集群service cluster

Pod虽然实现了集群内部互相通信,但是Pod是不稳定的,比如通过Deployment管理Pod,随时可能对Pod进行扩缩容,这时候Pod的IP地址是变化的。能够有一个固定的IP,使得集群内能够访问。也就是之前在架构描述的时候所提到的,能够把相同或者具有关联的Pod,打上Label,组成Service。而Service有固定的IP,不管Pod怎么创建和销毁,都可以通过Service的IP进行访问

k8s用service来解决这个问题,因为service会对应一个不会变的ip,然后内部通过负载均衡到相同label上的不同pod机器上

Service mesh 学习04 Kubernetes组件回顾_k8s_10

创建一个yaml文件

apiVersion: apps/v1 ## 定义了一个版本
kind: Deployment ##资源类型是Deployment
metadata: ## metadata这个KEY对应的值为一个Maps
  name: whoami-deployment ##资源名字
  labels: ##将新建的Pod附加Label
    app: whoami ##key=app:value=whoami
spec: ##资源它描述了对象的
  replicas: 3 ##副本数为1个,只会有一个pod
  selector: ##匹配具有同一个label属性的pod标签
    matchLabels: ##匹配合适的label
      app: whoami
  template: ##template其实就是对Pod对象的定义  (模板)
    metadata:
      labels:
        app: whoami
    spec:
      containers:
      - name: whoami ##容器名字  下面容器的镜像
        image: jwilder/whoami
        ports:
        - containerPort: 8000 ##容器的端口
kubectl apply -f whoami-deployment.yaml

查看详情kubectl get pods -o wide

Service mesh 学习04 Kubernetes组件回顾_k8s_11

查看服务 kubectl get svc

Service mesh 学习04 Kubernetes组件回顾_k8s_12

创建自己的service空间

kubectl expose deployment whoami-deployment
kubectl get svc

Service mesh 学习04 Kubernetes组件回顾_k8s_13

访问service的ip,可以看出访问到不同的机器

curl 10.99.247.110:8000

Service mesh 学习04 Kubernetes组件回顾_k8s_14

查看服务信息

kubectl describe svc whoami-deployment

Service mesh 学习04 Kubernetes组件回顾_k8s_15

节点数扩容到5个

kubectl scale deployment whoami-deployment --replicas=5
kubectl get pods

Service mesh 学习04 Kubernetes组件回顾_k8s_16

Service mesh 学习04 Kubernetes组件回顾_k8s_17

删除service

kubectl delete service whoami-deployment
kubectl get svc

Service mesh 学习04 Kubernetes组件回顾_k8s_18

五、服务集群NodePort

也是Service的一种类型,可以通过NodePort的方式

说白了,因为外部能够访问到集群的物理机器IP,所以就是在集群中每台物理机器上暴露一个相同的端口锁,比如32008

Service mesh 学习04 Kubernetes组件回顾_k8s_19

创建type为NodePort的service

kubectl expose deployment whoami-deployment --type=NodePort

Service mesh 学习04 Kubernetes组件回顾_k8s_20

浏览器访问http://192.168.183.134:30152

Service mesh 学习04 Kubernetes组件回顾_k8s_21

删除资源

kubectl delete -f whoami-deployment.yaml
kubectl delete svc whoami-deployment

六、Ingress

前面我们也学习可以通过service nodeport方式实现外部访问Pod的需求,但是会占用了各个物理主机上的端口,所以 这种方式不好

那接下来还是基于外部访问内部集群的需求,使用Ingress实现访问whoami需求

vi whoami-service.yaml
apiVersion: apps/v1 ## 定义了一个版本
kind: Deployment ##资源类型是Deployment
metadata: ## metadata这个KEY对应的值为一个Maps
  name: whoami-deployment ##资源名字
  labels: ##将新建的Pod附加Label
    app: whoami ##key=app:value=whoami
spec: ##资源它描述了对象的
  replicas: 3 ##副本数为1个,只会有一个pod
  selector: ##匹配具有同一个label属性的pod标签
    matchLabels: ##匹配合适的label
      app: whoami
  template: ##template其实就是对Pod对象的定义  (模板)
    metadata:
      labels:
        app: whoami
    spec:
      containers:
      - name: whoami ##容器名字  下面容器的镜像
        image: jwilder/whoami
        ports:
        - containerPort: 8000 ##容器的端口
---
apiVersion: v1
kind: Service
metadata:
  name: whoami-service
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8000
  selector:
    app: whoami

Service mesh 学习04 Kubernetes组件回顾_k8s_22

创建ingress

vi whoami-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress # 资源类型
metadata:
  name: whoami-ingress # 资源名称
spec:
  rules: # 定义规则
  - host: whoami.qy.com  # 定义访问域名
    http:
      paths:
      - path: / # 定义路径规则,/ 表示能够命中任何路径规则
        backend:
          serviceName: whoami-service  # 把请求转发给service资源,这个service就是我们前面运行的service
          servicePort: 80 # service的端口

kubectl apply -f  whoami-ingress.yaml 执行

Service mesh 学习04 Kubernetes组件回顾_k8s_23

报错是因为k8s版本太高了

查看ingress资源  

kubectl get ingress
kubectl describe ingress whoami-ingress

Service mesh 学习04 Kubernetes组件回顾_k8s_24

Service mesh 学习04 Kubernetes组件回顾_k8s_25

修改hosts文件  192.168.183.134 whoami.qy.com

Service mesh 学习04 Kubernetes组件回顾_k8s_26

Service mesh 学习04 Kubernetes组件回顾_k8s_27

浏览器发送请求给ingress,ingress根据规则配置把请求转发给对应的service,由于service配置了pod,所以请求最终发给了pod内对应的服务

浏览器发送请求给ingress,ingress根据规则配置把请求转发给对应的service,由于service配置了pod,所以请求最终发给了pod内对应的服务

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

dBFTbkVLMBge