1. pod
Pod是一组紧密关联的容器集合,它们共享PID、IPC、Network和UTS namespace,是Kubernetes调度的基本单位。Pod的设计理念是支持多个容器在一个Pod中共享网络和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务.
1.1 创建pod
# vim http.yaml
apiVersion: v1
kind: Pod
metadata:
name: demo
spec:
containers:
- image: httpd
name: httpd
imagePullPolicy: Always
# kubectl create -f pod.yaml
1.2 查看pod
# kubectl get pods
# kubectl describe pods
1.3 删除pod
# kubectl delete pod <pod-name>
2. Replicaset
Replicaset在继承Pod的所有特性的同时, 它可以利用预先创建好的模板定义副本数量并自动控制, 通过改变Pod副本数量实现Pod的扩容和缩容.
2.1 创建Replicaset
# vi replicaset.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: demo-rc
labels:
app: demo-rc
spec:
replicas: 2
selector:
matchLabels:
app: demo-rc
template:
metadata:
labels:
app: demo-rc
spec:
containers:
- name: httpd
image: httpd
imagePullPolicy: Always
...
3. Deployment
Deployment在继承Pod和Replicaset的所有特性的同时, 它可以实现对template模板进行实时滚动更新并具备我们线上的Application lifecycle的特性.
3.1 create
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpd-deployment
labels:
app: httpd-deployment
spec:
replicas: 2
selector:
matchLabels:
app: httpd-demo
template:
metadata:
labels:
app: httpd-demo
spec:
containers:
- name: httpd
image: httpd
imagePullPolicy: Always
ports:
- containerPort: 80
env:
- name: VERSION
value: "v1"
...
3.5 更新deployment
# kubectl edit -f deployment.yaml
通过此命令使当前编辑结果生效.
# kubectl apply -f deployment.yaml
3.6 扩容与缩容
可以修改replicas的赋值对deployment进行扩容与缩容
# kubectl scale deployment/httpd-deployment --replicas=1
4. Label
Label是attach到Pod的一对键/值对,用来传递用户定义的属性。比如,你可能创建了一个"tier"和“app”标签,通过Label(tier=frontend, app=myapp)来标记前端Pod容器,使用Label(tier=backend, app=myapp)标记后台Pod。然后可以使用Selectors选择带有特定Label的Pod,让具体某一个Pod或者Deployment去使用某一个Service实现特定的网络配置.
5. Service
Service是应用服务的抽象,通过labels为应用提供负载均衡和服务发现。匹配labels的Pod IP和端口列表组成endpoints,由kube-proxy负责将服务IP负载均衡到这些endpoints上。
每个Service都会自动分配一个cluster IP(仅在集群内部可访问的虚拟地址)和DNS名,其他容器可以通过该地址或DNS来访问服务,而不需要了解后端容器的运行。
5.1 更改NodePort限制
Kubernetes默认对外的NodePort限制范围为30000-32767, 这里如果要使用一些常用的端口(80, 8080, 443)需将这个范围放大.
# vi /etc/kubernetes/manifests/kube-apiserver.yaml
在--service-cluster-ip-range与insecure-port间添加如下node port配置
- --service-cluster-ip-range=10.96.0.0/12
- --service-node-port-range=0-32767
- --insecure-port=0
重启服务
# systemctl restart kubelet
5.2 创建service
# vi svc.yaml
apiVersion: v1
kind: Service
metadata:
name: demo
spec:
type: NodePort
ports:
- port: 80
nodePort: 30050
selector:
app: httpd-demo
# kubectl create -f svc.yaml
其中,port是pod提供的端口号,所有符合selector要求的pod提供的端口号都是80.
而nodeport是service对外提供服务所暴露的端口号。
5.3 查看service
# kubectl get svc demo
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
demo NodePort 10.100.57.243 <none> 80:30050/TCP 28m
# kubectl describe svc demo
Name: demo
Namespace: default
Labels:
Annotations:
Selector: app=httpd-demo
Type: NodePort
IP: 10.100.57.243
Port: 80/TCP
TargetPort: 80/TCP
NodePort: 30050/TCP
Endpoints: 10.244.0.3:80,10.244.1.5:80
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
demo 1/1 Running 0 53m 10.244.1.4 minion
httpd-deployment-5b749686c9-cfbkc 1/1 Running 0 8m 10.244.1.5 minion
httpd-deployment-5b749686c9-qjw7r 1/1 Running 0 8m 10.244.0.3 master
source-ip-app-8687dbf9f-kzb6h 1/1 Running 0 58m 10.244.1.3
可以看到,service中的selector信息为app: httpd-demo。create service的时候,会根据selector信息去匹配符合的pod,所有符合匹配的pod都会提供80端口,通过service demo向外提供服务,统一以ip 10.100.57.243暴露30050端口。
可以通过# curl 10.100.57.243 访问到service。