Pod:
Pod是一组紧密关联的容器集合,它们共享PID、IPC、Network和UTS namespace,是Kubernetes调度的基本单位。Pod的设计理念是支持多个容器在一个Pod中共享网络和文件系统,可以通过进程间通信和文件共享这种简单高效的方式组合完成服务.
缺点: 不支持高并发, 高可用, 当Pod当机后无法自动恢复.
1.创建Pod
# vi pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: demo
spec:
containers:
- image: httpd
name: httpd
imagePullPolicy: Always
# kubectl create -f pod.yaml
2.查看Pod
# kubectl get pods
NAME READY STATUS RESTARTS AGE
demo 1/1 Running 0 8d
# kubectl describe pods
3.删除Pod
# kubectl delete pod demo
Replicaset:
Replicaset在继承Pod的所有特性的同时, 它可以利用预先创建好的模板定义副本数量并自动控制, 通过改变Pod副本数量实现Pod的扩容和缩容
缺点: 无法修改template模板, 也就无法发布新的镜像版本
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
# kubectl create -f replicaset.yaml
2.查看replicaset
# kubectl get replicaset
NAME READY STATUS RESTARTS AGE
demo-rc 1/1 Running 0 8d
# kubectl describe replicaset
3.删除replicaset
# kubectl delete replicaset demo-rc
Deployment
Deployment在继承Pod和Replicaset的所有特性的同时, 它可以实现对template模板进行实时滚动更新并具备我们线上的Application life circle的特性.
1.创建Deployment
# vi deployment.yaml
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"
# kubectl create -f deployment.yaml
2.查看Deployment
# kubectl get deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
httpd-deployment 2 2 2 2 8d
# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
httpd-deployment-956697567-8mqch 1/1 Running 0 8d 10.244.0.36 kube-master
httpd-deployment-956697567-wcbs6 1/1 Running 0 8d 10.244.0.37 kube-master
# kubectl describe deployment
3.更新deployment
通过此命令可以呼出vi编辑器对模板进行编辑.
# kubectl edit -f deployment.yaml
通过此命令使当前编辑结果生效.
# kubectl apply -f deployment.yaml
再次查看可以看到老版本的deployment已经下架, 新版本的已经生效.
# kubectl get deployment
NAME DESIRED CURRENT READY AGE
httpd-deployment-6b98d94474 0 0 0 1m
httpd-deployment-956697567 2 2 2 7m
4.扩容与缩容
可以修改replicas的赋值对deployment进行扩容与缩容
# kubectl scale deployment/httpd-deployment --replicas=1
5.删除deployment
# kubectl delete deployment httpd-deployment
Lable
Label是attach到Pod的一对键/值对,用来传递用户定义的属性。比如,你可能创建了一个"tier"和“app”标签,通过Label(tier=frontend, app=myapp)来标记前端Pod容器,使用Label(tier=backend, app=myapp)标记后台Pod。然后可以使用Selectors选择带有特定Label的Pod,让具体某一个Pod或者Deployment去使用某一个Service实现特定的网络配置.
Service
Service是应用服务的抽象,通过labels为应用提供负载均衡和服务发现。匹配labels的Pod IP和端口列表组成endpoints,由kube-proxy负责将服务IP负载均衡到这些endpoints上。
每个Service都会自动分配一个cluster IP(仅在集群内部可访问的虚拟地址)和DNS名,其他容器可以通过该地址或DNS来访问服务,而不需要了解后端容器的运行。
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
2.创建Service
# vi svc.yaml
apiVersion: v1
kind: Service
metadata:
name: demo
spec:
type: NodePort
ports:
- port: 80
nodePort: 80
selector:
app: httpd-demo
# kubectl create -f svc.yaml
Tip: 如果要对某一Pod或deployment添加对外访问端口, 这里service添加的selector的键值需与之相对应.
3.查看开放端口
# kubectl get svc demo
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
demo NodePort 10.100.96.157 <none> 80:80/TCP 1h
# kubectl describe service demo
Name: demo
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=httpd-demo
Type: NodePort
IP: 10.100.96.157
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 80/TCP
Endpoints: 10.244.0.36:80,10.244.0.37:80
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>