k8s
replicaset
1.Replicaset概念
Kubernetes中的ReplicaSet主要的作用是维持一组Pod副本的运行,它的主要作用就是保证一定数量的 Pod 能够在集群中正常运行,它会持续监听这些 Pod 的运行状态,在 Pod 发生故障时重启pod,pod数量减少时重新运行新的 Pod 副本,因此,它通常被用来保证特定数量相同的Pods的可用性。
2.replicaset怎么工作
ReplicaSet由字段定义,包括一个选择器,该选择器指定如何找到它所管理的Pod、维护多少个pod,以及pod的模板。ReplicaSet通过创建和删除Pod来满足期望的pod数量。当ReplicaSet需要创建新的Pod时,它将使用其Pod模板。ReplicaSet通过Pods的metadata.ownerReferences字段链接到其Pod,该字段指定当前对象所拥有的资源。由ReplicaSet获取的所有Pod在其ownerReferences字段中都有其自己的ReplicaSet的标识信息。通过此链接,ReplicaSet可以知道它正在维护的Pod的状态,并据此计划。
ReplicaSet通过使用其选择器标识要获取的新Pod。如果存在没有OwnerReference的Pod或OwnerReference不是控制器,并且它与ReplicaSet的选择器匹配,它将由所述的ReplicaSet立即获取
3.什么时候使用replicaset
replicaSet确保在任何给定时间都运行指定数量的Pod副本。但是,Deployment是一个高级概念,用于管理副本集,并提供对Pod的声明性更新以及许多其他有用的功能。因此,除非你需要自定义更新编排或根本不需要更新,否则我们使用Deployment而不是直接使用replicaset。这实际上意味着你可能永远不需要操纵ReplicaSet对象:改用Deployment,然后在spec部分中定义你的应用程序。
例子:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: frontend
labels:
app: guestbook
tire: frontend
spec:
replicas: 3
selector:
matchLabels:
app: guestbook
tire: frontend
template:
metadata:
labels:
app: guestbook
tire: frontend
spec:
containers:
- name: php-redis
image: yecc/gcr.io-google_samples-gb-frontend:v3
编写replicaset资源清单文件
与所有其他 Kubernetes API对象一样,ReplicaSet需要apiVersion、kind、和metadata,ReplicaSet 也需要.spec部分。对于replicaset副本集来说,kind只能是replicaset,在kubernetes1.9+之后,apiversion默认的版本是apps/v1,apps/v1beta2已经被废弃了。
Pod template
.spec.template是一个Pod模板,还需要在其上放置标签。在我们的replicaset.yaml示例中,我们有一个标签:tier: frontend。注意不要与其他控制器的选择器重叠。对于 重启策略,.spec.template.spec.restartPolicy 唯一允许的取值是 Always,这也是默认值.
pod selector
.spec.selector字段是标签选择器。可以选择它所匹配的拥有相同标签的pod。在我们的 replicaset.yaml示例中,选择器为:
matchLabels:
tier: frontend
在ReplicaSet中,.spec.template.metadata.labels必须匹配spec.selector,否则将被API拒绝。
注意:对于指定相同.spec.selector但不同的.spec.template.metadata.labels和.spec.template.spec字段的2个replicaset,每个replicaset都会忽略另一个replicaset创建的Pod。
Replicas
通过设置 .spec.replicas 您可以指定要同时运行多少个 Pod。 在任何时间运行的 Pod 数量可能高于或低于 .spec.replicas 指定的数量,例如在副本刚刚被增加或减少后、或者 Pod 正在被优雅地关闭、以及替换提前开始。
如果您没有指定 .spec.replicas, 那么默认值为 1
删除
如果我们在 Kubernetes 集群中删除一个 ReplicaSet 持有的 Pod,那么控制器会重新同步 ReplicaSet 的状态并启动一个新的 Pod,但是如果删除集群中的 ReplicaSet 所有相关的 Pod 也都会被删除:
kubectl delete rs example
deployment
1.Deployment概念
Deployment控制器为 Pod 和 ReplicaSet 提供了一个声明式更新的方法,在Deployment对象中描述一个期望的状态,Deployment控制器就会按照一定的控制速率把实际状态改成期望状态,通过定义一个Deployment控制器会创建一个新的ReplicaSets控制器,通过replicaset创建pod,删除Deployment控制器,也会删除Deployment控制器下对应的ReplicaSet控制器和pod资源
Deployment可以用来管理上面说到的那种蓝绿发布情况的,建立在rs之上的,一个Deployment可以管理多个rs,有多个rs存在,但实际运行的只有一个,当你更新到一个新版本的时候,只是创建了一个新的rs,把旧的rs替换掉了
rs的v1控制三个pod,删除一个,在rs的v2上重新建立一个,依次类推,直到全部都是由rs2控制,如果rs v2有问题,还可以回滚,Deployment是建构在rs之上的,多个rs组成一个Deployment,但是只有一个rs处于活跃状态
典型的应用场景:
1)创建无状态的应用
2)滚动更新和回滚
2.使用Deployment运行无状态应用
(1)创建一个nginx deployment
(2)使用kubectl列举关于deployment信息
(3)更新deployment
3.创建一个nginx deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
在该示例中:
1.将创建名为 nginx-deployment 的Deployment ,由 .metadata.name 字段定义。
2.Deployment创建有两个副本的Pods,由 replicas 字段指定。
3.selector 字段定义Deployment如何查找要管理的Pods。在这种情况下,只需选择在 Pod模板(app: nginx)中定义的标签。
template 字段包含以下子字段:
使用labels字段将pod 的标签设置成app: nginx
.template.spec 定义pod要运行的容器,template.spec.name指定名字是nginx,template.spec.image指定运行的镜像是
kubectl get deployment
[root@master maintest]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 2/2 2 2 22m
[root@master maintest]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-d46f5678b 2 2 2 23m
1)展示刚才创建的deployment详细信息**
kubectl describe deployment nginx-deployment
2)列出deployment创建的拥有标签是app=nginx的pods**
kubectl get pods -l app=nginx
3)展示某一个pod的信息**
kubectl describe pods
4)更新deployment
你可以通过更新一个新的YAML文件来更新deployment. 下面的YAML文件指定该deployment镜像更新为nginx 1.8
通过增加副本数来扩容pod应用
查看历史版本
kubectl rollout history deployment nginx-deployment
显示如下:
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
1
2
5)按照指定版本回滚
[root@master maintest]# kubectl rollout undo deployment/nginx-deployment --to-revision=1
deployment.apps/nginx-deployment rolled back
6)通过Deployment管理replicaset
创建deployment的时候会创建一个replicaset,replicaset会在后台创建pod
kubectl get rs
#可看到创建的replicaset有哪些
7)删除deployment
kubectl delete deployment nginx-deployment
service
--pod-network-cidr=10.244.0.0/16 (pod网段)
--service-cidr=10.96.0.0/12 (service网段)
[root@master maintest]# cat pod.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
selector:
matchLabels:
run: my-nginx
replicas: 2
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 80
service 默认type类型为ClusterIP
[root@master maintest]# cat service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-nginx
labels:
run: my-nginx
spec:
ports:
- port: 80
protocol: TCP
selector:
run: my-nginx
service 代理到对应的后端pod
映射到宿主机端口
.service.spec.type
NodePort
apiVersion: v1
kind: Service
metadata:
name: my-nginx
labels:
run: my-nginx
spec:
ports:
- port: 80
protocol: TCP
type: NodePort
selector:
run: my-nginx
[root@master maintest]# kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 69d <none>
my-nginx NodePort 10.106.132.151 <none> 80:30994/TCP 21h run=my-nginx
访问node节点的ip:30994---->service ip:80---->pod ip:80
创建没有selector的service
[root@master maintest]# cat noselector.yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
ports:
- port: 80
protocol: TCP
targetPort: 3306
endpoint.yaml
[root@master maintest]# cat endpoint.yaml
apiVersion: v1
kind: Endpoints
metadata:
name: my-service
subsets:
- addresses:
- ip: 1.2.3.4
ports:
- port: 3306
[root@master maintest]# kubectl describe svc my-service
Name: my-service
Namespace: default
Labels: <none>
Annotations: <none>
Selector: <none>
Type: ClusterIP
IP Families: <none>
IP: 10.104.205.156
IPs: <none>
Port: <unset> 80/TCP
TargetPort: 3306/TCP
Endpoints: 1.2.3.4:3306
Session Affinity: None
Events: <none>
创建type是ExternalName的service
[root@master maintest]# cat external.yamlapiVersion: v1kind: Servicemetadata: name: my-service namespace: prodspec: type: ExternalName externalName: my.database.example.com
volume
emptyDir临时目录
[root@master maintest]# cat emptyDir.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: test-container
image: nginx
volumeMounts:
- mountPath: /cache
name: cache-volume
volumes:
- emptyDir: {}
name: cache-volume
[root@master maintest]# kubectl get pods
NAME READY STATUS RESTARTS AGE
my-nginx-5dc4865748-sx85q 1/1 Running 2 2d16h
my-nginx-5dc4865748-wgvcj 1/1 Running 2 2d16h
test-pod 1/1 Running 0 2m12s
进入pod的容器
[root@master maintest]# kubectl exec -it test-pod -c test-container -- /bin/bash
root@test-pod:/# cd /cache/
root@test-pod:/cache# ls
root@test-pod:/cache# pwd
/cache
root@test-pod:/cache#
root@test-pod:/cache# exit
exit
hostPath
[root@master maintest]# cat hostPath.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-hostpath
spec:
containers:
- name: test-nginx
image: nginx
imagePullPolicy: IfNotPresent
volumeMounts:
- name: test-volume
mountPath: /test-nginx
- name: test-tomcat
image: tomcat
imagePullPolicy: IfNotPresent
volumeMounts:
- name: test-volume
mountPath: /test-tomcat
volumes:
- name: test-volume
hostPath:
path: /data
type: DirectoryOrCreate
给节点打标签
kubectl label node node node-role.kubernetes.io/woker='abc'
# 打标签
kubectl label node node node-role.kubernetes.io/woker-
# 去标签
设置ipvs模式 默认iptables
#1、 kube-proxy使用模式
kubectl logs -n kube-system kube-proxy-3246fd
#2. 需要修改kube-proxy的配置文件,修改mode为ipvs。
[root@master ~]# kubectl edit cm kube-proxy -n kube-system
mode 'ipvs'
kubectl get pods -A -o wide
kubectl get pods -A | grep kube-proxy
kubectl exec -it 名称
kubectl run hello-pod --image=nginx
1、创建一个应用
创建一次部署工作。
kubectl create deploy xxxx : 命令行会给api-server 发送要部署的xxx请求
api-server把这个请求保存到etcd
kubectl create deployment 名称 --image=nginx
手动扩缩容给
kubectl get deploy,pod
kubectl scale --replicas=3 deploy my-nginx
对外访问
kubectl expose deploy my-nginx --port=8912 --target-port=80 --type=NodePort
--port service 端口 集群内部端口
--target-port 目标端口(容器)端口
--type (NodePort、ClusterIp)ClusterIp集群ip
滚动升级
kubectl rollout undo history deploy my-nginx # undo(默认回滚上一个版本)
kubectl rollout undo deploy my-nginx --to-revision=1
k8s对象描述文件
声明式api yaml
kubectl apply -f XXX.yaml
描述对象
写任意资源的yaml
kubectl explain xxx
kubectl get pod my-nginx -oyaml
kubectl run my-nginx --image=nginx --dry-run -oyaml
kubectl create deploy mydeploy --image=nginx --dry-run -oyaml
自动补全
进入容器
kubectl exec -it podName -c container_Name -- /bin/bash
kubectl rollout pause ***
kubectl rollout resume ***

浙公网安备 33010602011771号