Kubernetes提供类似于docker run 的命令kubectl run ,方便创建一个容器,实际上,是创建一个由deployment管理的pod。

kubectl run --image=nginx nginx-app --port=80

查看创建的pods

kubectl get pods

当容器变为Running状态,可以使用kubectl操作容器。

查询资源列表,类似于docker ps

kubectl get

获取资源详细信息,类似于docker inspect

kubectl describe

获取容器日志,类似于docker logs

kubectl logs

在容器内执行一个命令,类似于docker exec

kubectl exec

下面以nginx容器表示一下流程

# 1. 查看资源
kubectl get pods

# 2. 在容器内部执行命令
kubectl exec nginx-app-4028413181-cnt1i ps aux

# 3. 查看容器的描述信息
kubectl describe pod nginx-app-4028413181-cnt1i

# 4. 查看容器日志
kubectl logs nginx-app-4028413181-cnt1i

使用yaml定义Pod

上面通过kubectl run 启动Pod,在K8s中,更经常的是使用yaml文件定义资源,并通过kubectl create -f file.yaml 创建资源。

简单的nginx Pod可以定义为:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
  spec:
    containers:
    - name: nginx
      image: nginx
      ports:
      - containerPort: 80

上面提到,kubectl run 并不是直接创建一个Pod,而是先创建一个Deployment资源(replicas=1),再由Deployment自动创建Pod,这等价于

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    run: nginx-app
  name: nginx-app
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      run: nginx-app
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
  template:
    metadata:
      labels:
        run: nginx-app
    spec:
      containers:
      - image: nginx
        name: nginx-app
        ports:
        - containerPort: 80
          protocol: TCP
      dnsPolicy: ClusterFirst
      restartPolicy: Always

使用Volume

Pod的生命周期通常比较短,只要出现异常,就会创建一个新的Pod代替它。

而容器内的数据会随着Pod消亡而自动消失。Volume就是为了持久化容器数据而生。

比如,可以为redis容器指定一个hostPath来存储redis数据。

apiVersion: v1
kind: Pod
metadata:
  name: redis
spec:
  containers:
  - name: redis
    image: redis
    volumeMounts:
    - name: redis-persistent-storage
      mountPath: /data/redis
  volumes:
  - name: redis-persistent-storage
    hostPath:
      path:/data/

Kubernetes volume支持众多插件:

  • emptyDir

  • hostPath

  • gcePersistentDisk

  • awsElasticBlockStore

  • nfs

  • iscsi

  • flocker

  • glusterfs

  • rbd

  • cephfs

  • gitRepo

  • secret

  • persistentVolumeClaim

  • downwardAPI

  • azureFileVolume

  • vsphereVolume

使用Service

在kubernetes中,Pod的IP地址会随着Pod的重启而变化,也因此并不建议直接使用Pod的IP交互。

Service为一组Pod(通过labels选择)提供统一的入口,并为它们提供负载均衡和自动服务发现。

比如,为nginx-app创建service

kubectl expose deployment nginx-app --type=NodePort --port=80 --target-port=80

描述nginx-app服务

kubectl describe service nginx-app

在这里,cluster内部可以通过http://10.0.0.66http://node-ip:30772 访问nginx-app。

在cluster外部,只能通过http://node-ip:30772 访问。

results matching ""

    No results matching ""