①Kubernetes实现资源限制,对每个Pod设置资源限制

[ro[email protected] k8s-yaml] cat nginx-resource.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx

spec:
  containers:
  - name: nginx
     image: nginx
     resources:
       requests:
         memory: "64Mi"
         cpu: "250m"
       limits:
         memory: "128Mi"
         cpu: "500m"

②Kubernetes调度约束,将Pod调度到某一固定的后端node节点上

[[email protected] k8s-yaml]# cat nginx-node-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-deploymeng-node
spec:
  replicas: 3
  template:
    metadata:
      name: nginx-pod
      labels:
        app: nginx
    spec:
      nodeName: 192.168.175.131   ##将3个pod部署在192.168.175.130节点上
      containers:
      - name: test
        image: nginx:1.10
        ports:
        - containerPort: 80

创建,并查看deploment部署情况,成功部署

Kubernetes实现资源限制,调度约束,服务发现以及健康检查

查看pod节点分布

Kubernetes实现资源限制,调度约束,服务发现以及健康检查

③Kubernetes服务发现,使得Deployment以及单个Pod节点在创建的时候能够自动发现Service

注意:想要让Pod,Deplyment在创建的时候自动加入到Service中,必须要先启动Service,然后再创建Pod,Deployment

创建Service:

[[email protected] k8s-yaml]# cat nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: nginx


ports上下文:

  port: 80表示服务对外开启的接口可以通过80端口进行访问。这个对外仅限于node节点。

  targetPort: 80表示通过port的端口可以去访问到pod的80端口。

selector上下文:

  app: nginx表示标签,当Pod节点,Deployment的标签为Service相同标签的话,就可以加入到Service中。

Kubernetes实现资源限制,调度约束,服务发现以及健康检查

启动deployment,参考②进行创建,label要一致,启动之后进入pod中查看容器变量,如图,成功加入到Service中

Kubernetes实现资源限制,调度约束,服务发现以及健康检查

④Kubernetes健康检查,在Pod启动后进行检测

livenessProbe
如果检查失败,将杀死容器,根据Pod的restartPolicy来操作。
  readinessProbe
如果检查失败,Kubernetes会把Pod从service endpoints中剔除。
Probe支持以下三种检查方法:
httpGet
  发送HTTP请求,返回200-400范围状态码为成功。
exec
  执行Shell命令返回状态码是0为成功。
tcpSocket
  发起TCP Socket建立成功。


注意:默认的Pod的重启规则restartPolicy为Always


httpGet,访问固定页面,若能够访问则判断改Pod为健康,否则重启,对Pod节点中的index.html文件进行健康监测。

启动该yaml文件,注意,Service服务一直开启着,要不无法访问该Pod。

[[email protected] k8s-yaml]# cat nginx-health.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-health
  labels:
    app: nginx
spec:
  containers:
  - name: nginx-health
    image: nginx:1.10
  #  volumeMounts:
  #  - name: nginx-mount
  #    mountPath: /tmp/k8s-yaml
    livenessProbe:
      #tcpSocket:
      httpGet:
        path: /index.html
        port: 80
      initialDelaySeconds: 10
      periodSeconds: 5
      timeoutSeconds: 3
    ports:
    - containerPort: 80
  #volumes:
  #- name: nginx-mount
  #  hostPath:
  #    path: /tmp/k8s-yaml


initialDelaySeconds: 10 表示在Pod启动10秒后进行检测。
periodSeconds: 5 表示进行健康监测的频率为5秒1次。
timeoutSeconds: 3 表示健康监测失败后的超时时长。

可以试着将index.html删除,或换一个文件路径,这样使用kubectl describe pod nginx-health就会显示unhealthy


tcpSocket,通过检测80,或其他端口是否正常来判断Pod的健康状态。

[[email protected] k8s-yaml]# cat nginx-health.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-health
  labels:
    app: nginx
spec:
  containers:
  - name: nginx-health
    image: nginx:1.10
  #  volumeMounts:
  #  - name: nginx-mount
  #    mountPath: /tmp/k8s-yaml
    livenessProbe:
      tcpSocket:
      #httpGet:
        #path: /index.html
        port: 80
      initialDelaySeconds: 10
      periodSeconds: 5
      timeoutSeconds: 3
    ports:
    - containerPort: 80
  #volumes:
  #- name: nginx-mount
  #  hostPath:
  #    path: /tmp/k8s-yaml


exec,通过命令行的形式进行健康状态检测。

[[email protected] k8s-yaml]# cat nginx-health-exec.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-exec
spec:
  containers:
  - name: liveness
    image: nginx:1.10
    livenessProbe:
      exec:
        command:
        - cat
        - /usr/share/nginx/html/index.html
      initialDelaySeconds: 10
      periodSeconds: 5
      timeoutSeconds: 3