创建ReplicaSet

ReplicaSet的配置如下

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: myapp
  namespace: default
spec:
  replicas: 2
  selector: 
    matchLabels:
      app: myapp
      release: canary
  template:
    metadata:
      name: myapp-pod
      labels: 
        app: myapp
        release: canary
        environment: qa
    spec:
      containers:
      - name: myapp-container
        image: ikubernetes/myapp:v1
        ports:
        - name: http
          containerPort: 80

在这个ReplicaSet中,我们设置了两个label,app=myapp, release=canary , 创建rs后,查看

[root@master manifests]# kubectl create -f rs-demo.yaml --dry-run
replicaset.apps/myapp created (dry run)
[root@master manifests]# kubectl create -f rs-demo.yaml 
replicaset.apps/myapp created
[root@master manifests]# kubectl get pods
NAME          READY     STATUS    RESTARTS   AGE
myapp-bj795   1/1       Running   0          18s
myapp-blmx8   1/1       Running   0          18s
[root@master manifests]# vim rs-demo.yaml 
[root@master manifests]# kubectl get pods --show-labels
NAME          READY     STATUS        RESTARTS   AGE       LABELS
myapp-b8sb5   1/1       Running       0          5m        app=myapp,environment=qa,release=canary
myapp-blmx8   1/1       Running       0          8m        app=myapp,environment=qa,release=canary
[root@master manifests]# kubectl get rs
NAME      DESIRED   CURRENT   READY     AGE
myapp     2         2         2         39s

实验

ReplicaSet会通过label app=myapp, release=canary 来筛选Pod,并且设定的符合该label的Pod副本应该为2个。

pod-demo.yaml文件的内容如下:

apiVersion: v1
kind: Pod
metadata:
  name: pod-demo
  namespace: default
  labels:
    app: myapp
    tier: frontend
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    ports:
    - name: http
      containerPort: 80
    - name: https
      containerPort: 443
  - name: busybox
    image: busybox:latest
    #ImagePullPolicy: IfNotPresent
    command: 
    - "/bin/sh"
    - "-c"
    - "sleep 3600"

此时,我们创建另一个pod

[root@master manifests]# kubectl create -f pod-demo.yaml 
pod/pod-demo created
[root@master manifests]# kubectl get pods --show-labels
NAME          READY     STATUS    RESTARTS   AGE       LABELS
myapp-b8sb5   1/1       Running   0          5m        app=myapp,environment=qa,release=canary
myapp-blmx8   1/1       Running   0          7m        app=myapp,environment=qa,release=canary
pod-demo      2/2       Running   0          11s       app=myapp,tier=frontend

可以看到,pod-demo的label为 app=myapp,tier=frontend ,我们尝试给pod-demo添加一个label release=canary ,看下会出现什么效果。

[root@master manifests]# kubectl label pods pod-demo release=canary
pod/pod-demo labeled
[root@master manifests]# kubectl get pods --show-labels
NAME          READY     STATUS        RESTARTS   AGE       LABELS
myapp-b8sb5   1/1       Running       0          5m        app=myapp,environment=qa,release=canary
myapp-blmx8   1/1       Running       0          8m        app=myapp,environment=qa,release=canary
pod-demo      2/2       Terminating   0          34s       app=myapp,release=canary,tier=frontend

可以发现: pod-demo的状态已经为 Terminating。 说明ReplicaSet通过标签选择器获取到了三个副本,然后预期的副本数被设定为2,它随机杀掉了一个。

应该是随机的, 不过,我测试了几次,都是把新建的pod-demo杀掉了。


felix0913
27 声望1 粉丝