k8s创建资源的两种方式、访问pod

创建资源

1.用kubectl命令直接创建,

#kubectl run httpd-app --image=reg.yunwei.edu/learn/httpd:latest --replicas=2

在命令行中通过参数指定资源的属性。

2. 通过配置文件和 kubectl apply 创建,要完成前面同样的工作,可执行命令:

#kubectl apply -f httpd.yml

httpd.yml 的内容为:

apiVersion: extensions/v1beta1

kind: Deployment

metadata:

  name: httpd-deployment

spec:

  replicas: 2

  template:

    metadata:

      labels:

        name: httpd

    spec:

      containers:

      - name: httpd-app

        image: reg.yunwei.edu/test/httpd:latest

#kubectl apply -f httpd.yml

#kubectl get pod

下面对这两种方式进行比较。

基于命令的方式:

  1. 简单直观快捷,上手快。

  2. 适合临时测试或实验。

基于配置文件的方式:

  1. 配置文件描述了 What,即应用最终要达到的状态。

  2. 配置文件提供了创建资源的模板,能够重复部署。

  3. 可以像管理代码一样管理部署。

  4. 适合正式的、跨环境的、规模化部署。

  5. 这种方式要求熟悉配置文件的语法,有一定难度。

kubectl apply 不但能够创建 Kubernetes 资源,也能对资源进行更新,非常方便。不过 Kubernets 还提供了几个类似的命令,例如 kubectl createkubectl replacekubectl edit 和 kubectl patch

deployment的配置格式

1、apiVersion 是当前配置格式的版本。

2、kind 是要创建的资源类型,这里是 Deployment。

3、metadata 是该资源的元数据,name 是必需的元数据项。

4、spec 部分是该 Deployment 的规格说明。

5、replicas 指明副本数量,默认为 1。

6、template 定义 Pod 的模板,这是配置文件的重要部分。

7、metadata 定义 Pod 的元数据,至少要定义一个 label。label 的 key 和 value 可以任意指定。

8、labels打一个标签

9、spec 描述 Pod 的规格,此部分定义 Pod 中每一个容器的属性,name 和 image 是必需的。

运行yaml配置文件

运行pod
#kubectl apply -f httpd.yml

删除pod
#kubectl delete -f httpd.yml

(1)伸缩(Scale Up/Down): 是指在线增加或减少 Pod 的副本数。直接写改yaml配置文件的replicas: 参数即可出于安全考虑,默认配置下 Kubernetes 不会将 Pod 调度到 Master 节点。

通过修改yaml文件使pod节点增加为3个

(2)节点故障(Failover): 若其中一个node故障, Kubernetes 会检查到 k8s-node3 不可用,将 k8s-node1 上的 Pod 标为 Unknown 状态,并在 k8s-node2 上新创建两个 Pod,维持总副本数为原指定副本数 3。当 k8s-node2 恢复后,Unknown 的 Pod 会被删除,不过已经运行的 Pod 不会重新调度回 k8s-node2。

(3)用 label 控制 Pod 的位置: 默认配置下,Scheduler 会将 Pod 调度到所有可用的 Node。不过有些情况我们希望将 Pod 部署到指定的 Node,比如将有大量磁盘 I/O 的 Pod 部署到配置了 SSD 的 Node;或者 Pod 需要 GPU,需要运行在配置了 GPU 的节点上。

获取所有节点标记
#kubectl get node --show-labels

给154的节点打个标记
#kubectl label node 192.168.146.154 disktype=ssd

修改yaml文件,添加两行

删除节点标签(指定为空)
#kubectl label node 192.168.146.154 disktpye-

DaemonSet应用

Deployment 部署的副本 Pod 会分布在各个 Node 上,每个 Node 都可能运行好几个副本。DaemonSet 的不同之处在于:每个 Node 上最多只能运行一个副本。

DaemonSet 的典型应用场景有:

  1. 在集群的每个节点上运行存储 Daemon,比如 glusterd 或 ceph。

  2. 在每个节点上运行日志收集 Daemon,比如 flunentd 或 logstash。

  3. 在每个节点上运行监控 Daemon,比如 Prometheus Node Exporter 或 collectd。

#kubectl get daemonset --namespace=kube-system

DaemonSet calico-node分别负责在每个节点上运行 calico-node 组件。

如何访问pod

通过service访问pod

每个 Pod 都有自己的 IP 地址。当旧的Pod down了后, controller 用新 Pod 替代发生故障的 Pod 时,新 Pod 会分配到新的 IP 地址,导致提供服务的Pod的ip会发生变化。

Kubernetes Service 从逻辑上代表了一组 Pod,具体是哪些 Pod 则是由 label 来挑选。Service 有自己 IP,而且这个 IP 是不变的。客户端只需要访问 Service 的 IP,Kubernetes 则负责建立和维护 Service 与 Pod 的映射关系。无论后端 Pod 如何变化,对客户端不会有任何影响,因为 Service 没有变。

创建Service

创建service文件
#vim httpd-svc.yml

apiVersion: v1

kind: Service

metadata:

  name: httpd-svc

spec:

  ports:

    - port: 8080

      targetPort: 80

#将service的8080端口映射到pod的80端口

      protocol: TCP

  selector:

    run: httpd

#vim httpd.yml

  labels:

    name: httpd

    run: httpd

spec:

  containers:

    ports:

    - containerPort: 80

 

#kubectl apply -f httpd.yml
#kubectl apply -f httpd-svc.yml

修改httpd的编排文件,重新创建,发现pod的ip发生改变,再访问service ip

    

 Service IP原理

Service Cluster IP 是一个虚拟 IP,是由 Kubernetes 节点上的 iptables 规则管理的。可以通过 iptables-save 命令打印出当前节点的 iptables 规则。

由路由转发规则可知,访问service ip10.68.225.168:8080时,需要转发2次,才能访问到pod ip172.20.182.210:80

DNS访问Service

在 Cluster 中,除了可以通过 Cluster IP 访问 Service,Kubernetes 还提供了更为方便的 DNS 访问。

kubeadm 部署时会默认安装 kube-dns 组件。

coredns 是一个 DNS 服务器。每当有新的 Service 被创建,coredns 会添加该 Service 的 DNS 记录。Cluster 中的 Pod 可以通过 <SERVICE_NAME>.<NAMESPACE_NAME> 访问 Service。

比如可以用 httpd-svc.default 访问 Service httpd-svc。

外网访问Service

#vim httpd-svc.yml

#nodePort: 26055 

#也可以使用随机端口,端口号范围2000-40000

ClusterIP 

Service 通过 Cluster 内部的 IP 对外提供服务,只有 Cluster 内的节点和 Pod 可访问,这是默认的 Service 类型,前面实验中的 Service 都是 ClusterIP。

NodePort 

Service 通过 Cluster 节点的静态端口对外提供服务。Cluster 外部可以通过 <NodeIP>:<NodePort> 访问 Service。

LoadBalancer 

Service 利用 cloud provider 特有的 load balancer 对外提供服务,cloud provider 负责将 load balancer 的流量导向 Service。目前支持的 cloud provider 有 GCP、AWS、Azur 等。

猜你喜欢

转载自blog.csdn.net/PpikachuP/article/details/89674578