创建资源
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
#kubectl apply -f httpd.yml
#kubectl get pod
下面对这两种方式进行比较。
基于命令的方式:
-
简单直观快捷,上手快。
-
适合临时测试或实验。
基于配置文件的方式:
-
配置文件描述了
What
,即应用最终要达到的状态。 -
配置文件提供了创建资源的模板,能够重复部署。
-
可以像管理代码一样管理部署。
-
适合正式的、跨环境的、规模化部署。
-
这种方式要求熟悉配置文件的语法,有一定难度。
kubectl apply
不但能够创建 Kubernetes 资源,也能对资源进行更新,非常方便。不过 Kubernets 还提供了几个类似的命令,例如 kubectl create
、kubectl replace
、kubectl 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 的典型应用场景有:
-
在集群的每个节点上运行存储 Daemon,比如 glusterd 或 ceph。
-
在每个节点上运行日志收集 Daemon,比如 flunentd 或 logstash。
-
在每个节点上运行监控 Daemon,比如 Prometheus Node Exporter 或 collectd。
#kubectl get daemonset --namespace=kube-system
DaemonSet calico-node分别负责在每个节点上运行 calico-node 组件。
如何访问pod
通过service访问pod
创建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 ip10.68.225.168:8080时,需要转发2次,才能访问到pod ip172.20.182.210:80
DNS访问Service
在 Cluster 中,除了可以通过 Cluster IP 访问 Service,Kubernetes 还提供了更为方便的 DNS 访问。
比如可以用 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 等。