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 ***
posted @ 2022-01-17 13:09  给我一碗炒粉  阅读(133)  评论(0)    收藏  举报