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.66
和http://node-ip:30772
访问nginx-app。
在cluster外部,只能通过http://node-ip:30772
访问。