一、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
查看pod
kubectl get pods
查看pod详情
kubectl get pods -o wide
查看deployment
kubectl get deployment -o wide
二、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
三、Namespace命名空间
命名空间就是为了隔离不同的资源。比如:Pod、Service、Deployment等。可以在输入命令的时候指定命名空间-n,如果不指定,则使用默认的命名空间:default
查看一下当前的所用命名空间:kubectl get namespaces/ns
查看一下kube-system命名空间:kubectl get pods -n kube-system
创建自己的命名空间
vi my-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: myns
kubectl apply -f my-namespace.yaml
查看命令kubectl get ns
删除命名空间 kubectl delete namespaces myns
四、服务集群service cluster
Pod虽然实现了集群内部互相通信,但是Pod是不稳定的,比如通过Deployment管理Pod,随时可能对Pod进行扩缩容,这时候Pod的IP地址是变化的。能够有一个固定的IP,使得集群内能够访问。也就是之前在架构描述的时候所提到的,能够把相同或者具有关联的Pod,打上Label,组成Service。而Service有固定的IP,不管Pod怎么创建和销毁,都可以通过Service的IP进行访问
k8s用service来解决这个问题,因为service会对应一个不会变的ip,然后内部通过负载均衡到相同label上的不同pod机器上
创建一个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
查看服务 kubectl get svc
创建自己的service空间
kubectl expose deployment whoami-deployment
kubectl get svc
访问service的ip,可以看出访问到不同的机器
curl 10.99.247.110:8000
查看服务信息
kubectl describe svc whoami-deployment
节点数扩容到5个
kubectl scale deployment whoami-deployment --replicas=5
kubectl get pods
删除service
kubectl delete service whoami-deployment
kubectl get svc
五、服务集群NodePort
也是Service的一种类型,可以通过NodePort的方式
说白了,因为外部能够访问到集群的物理机器IP,所以就是在集群中每台物理机器上暴露一个相同的端口锁,比如32008
创建type为NodePort的service
kubectl expose deployment whoami-deployment --type=NodePort
浏览器访问http://192.168.183.134:30152
删除资源
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
创建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 执行
报错是因为k8s版本太高了
查看ingress资源
kubectl get ingress
kubectl describe ingress whoami-ingress
修改hosts文件 192.168.183.134 whoami.qy.com
浏览器发送请求给ingress,ingress根据规则配置把请求转发给对应的service,由于service配置了pod,所以请求最终发给了pod内对应的服务
浏览器发送请求给ingress,ingress根据规则配置把请求转发给对应的service,由于service配置了pod,所以请求最终发给了pod内对应的服务