部署运行实例
好了,环境我们已经安装完毕,现在来演示运行一个实例,这里我已 tomcat 镜像为例,演示部署服务,发布服务,扩容缩容服务等操作。
1、创建并启动 minikube 虚拟机
$ minikube start
Starting local Kubernetes cluster...
Running pre-create checks...
Creating machine...
Starting local Kubernetes cluster...
2、创建 hello-minikube 部署
$ kubectl run hello-minikube --image=tomcat:8.0 --port=8080
deployment "hello-minikube" created
3、发布服务 hello-minikube
$ kubectl expose deployment hello-minikube --type=NodePort
service "hello-minikube" exposed
4、查看 pods
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-minikube-598805112-3bzmf 1/1 ContainerCreating 0 5s
注意:刚开始时,pod 没有完全创建好的时候,状态是 ContainerCreating,当部署完成后,状态就变成 Running。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-minikube-598805112-3bzmf 1/1 Running 0 25s
5、获取服务地址
$ minikube service hello-minikube --url
http://192.168.99.102:30724
$ minikube service hello-minikube 将直接打开地址到默认浏览器上。
6、停止 minikube 虚拟机
$ minikube stop
Stopping local Kubernetes cluster...
Stopping "minikube"...
注意:在部署过程中可能会出现问题,大部分跟网络相关,下载 images 时会超时报错,解决办法是一安装翻墙工具,二是替代需要翻墙下载的 images。以下是我本机实验遇到的问题,以及解决方法。
问题一:命令行下载 tomcat:8.0 镜像,执行 docker pull tomcat:8.0
没有任何反应,初步分析可能是 minikube 虚拟机里没有连接到本地 docker 服务。
$ minikube docker-env
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.102:2376"
export DOCKER_CERT_PATH="/Users/wanyang3/.minikube/certs"
export DOCKER_API_VERSION="1.23"
执行 eval $(minikube docker-env)
,即设置 minikube 虚拟机的 docker 环境变量即可。
问题二:执行完毕上边 2 和 3 步骤后,发现 hello-minikube 服务并没有成功启动。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-minikube-598805112-3bzmf 0/1 ContainerCreating 0 15s
发现 hello-minikube 的状态一直是 ContainerCreating,并且 READY 为 0/1,通过 minikube logs
查看日志可以看出,有一个镜像 gcr.io/google_containers/pause-amd64:3.0
显示拉取失败,分析原因应该是 gcr.io 这个地址被墙了。
# 替换镜像
$ docker pull visenzek8s/pause-amd64:3.0
$ docker tag visenzek8s/pause-amd64:3.0 gcr.io/google_containers/pause-amd64:3.0
# 显式设置拉取策略为 IfNotPresent
$ kubectl run hello-minikube --image=tomcat:8.0 --port=8080 --image-pull-policy=IfNotPresent
方案就是替换该镜像,然后可以设置拉取策略为优先本地获取,本地没有再去远程获取。因为这里服务启动策略为 always,会定时自动重新拉取,所以一旦本地拉取该镜像后,我们会发现上边 hello-minikube 一会就启动成功了。
下边介绍一下 kubectl 一些其他常用操作。
1、创建资源的两种方式
1.1 通过 Yaml 或 Json 文件创建
$ kubectl create -f <file_path>/xxx.yaml | <file_path>/xxx.json --[options]
eg:kubectl create -f ./redis.yaml
简单的 redis.yaml
示例:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: hello-redis
namespace: my-kube
spec:
replicas: 2
template:
metadata:
labels:
group: hello-scm
my-kube: hello-redis
k8s-app: redis
spec:
containers:
- name: redis
image: redis:latest
---
apiVersion: v1
kind: Service
metadata:
labels:
group: hello-scm
kubernetes.io/cluster-service: 'true'
kubernetes.io/name: hello-redis
name: hello-redis
namespace: my-kube
spec:
ports:
- port: 6379
targetPort: 6379
selector:
k8s-app: redis
yaml 文件要符合 kubernetes 的规范,可以参考官网对 yaml 语法定义,可以自学一下,这里就不展开来说了。
1.2 指定镜像启动
$ kubectl run --image=xxxx:xx --[options]
eg: kubectl run hello-minikube --image=tomcat:8.0 --port=8080
2、复制多个部署 pod
$ kubectl scale --replicas=3 deployment/hello-minikube
deployment "hello-minikube" scaled
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-minikube-598805112-3bzmf 1/1 Running 1 1d
hello-minikube-598805112-vrskz 1/1 Running 1 1d
hello-minikube-598805112-xwq55 1/1 Running 1 1d
也可以在启动时,指定复制数量
$ kubectl run hello-minikube --image=tomcat:8.0 --port=8080 --replicas=3
3、暴露 pod (po), service (svc), replicationcontroller (rc), deployment (deploy), replicaset (rs) 成新的服务
$ kubectl expose po | svc | rc | delpoy | rs --[options]
eg:kubectl expose deployment hello-minikube --type=NodePort # 暴露名称为 hello-minikube 部署为类型为 NodePort 的服务
eg:kubectl expose rc hello-nginx --port=80 --target-port=8000 --type=NodePort # 暴漏名称为 nginx 的副本为指定服务端口80,连接该服务端口8000,类型为 NodePort 的服务
$ kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-minikube NodePort 10.0.0.176 <none> 8080:30724/TCP 1d
hello-nginx NodePort 10.0.0.94 <none> 80:8000/TCP 1d
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 1d
4、重新加载某个资源
$ kubectl apply -f <file_path>/xxx.yaml | <file_path>/xxx.json --[options]
eg:kubectl apply -f ./redis.yaml
5、查看 pod, service, replicationcontroller, deployment, replicaset 各种类型资源信息列表
$ kubectl get po | svc | rc | deploy | rs # 查看默认 namespace 下各类型资源信息列表
$ kubectl get po | svc | rc | deploy | rs --all-namespaces # 查看所有 namespace 下各类型资源信息列表
6、查看 pod, service, replicationcontroller, deployment, replicaset 各种类型资源日志信息或描述信息
$ kubectl logs <resource_type>/<resource_name> [options]
eg:kubectl logs -f po/hello-minikube-598805112-3bzmf # 查看指定 pod 的日志
eg:kubectl logs deploy/hello-nginx -n my-kube # 查看指定 delpoy 和 namespace 的日志
$ kubectl describe <resource_type>/<resource_name> [options]
eg:kubectl describe pods # 查看所有 pod 的描述信息
eg:kubectl describe po/hello-minikube-598805112-3bzmf # 查看指定 pod 的描述信息
eg:kubectl describe deploy/hello-nginx -n my-kube # 查看指定 delpoy 和 namespace 的描述信息
7、查看集群信息
$ kubectl cluster-info
Kubernetes master is running at https://192.168.99.102:8443