以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
8、Kubernetes Dashboard 安装
默认安装完了 minikube,我们会发现他会自动安装 Dashboard,但是我们通过 minikube dashboard
命令并不能在浏览器上打开 Dashboard 网页。这是啥原因呢?
$ kubectl get pods --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE ... kube-system kube-addon-manager-minikube 0/1 ContainerCreating 1 10s kube-system kube-dns-910330662-653vt 0/3 ContainerCreating 1 15s kube-system kubernetes-dashboard-9k5vl 0/1 ContainerCreating 1 15s ...
在通过命令,我们发现 kube-dns 和 kubernetes-dashboard 并没有启动成功,最后通过查看下日志信息 minikube logs
或 kubectl logs -f pods/kubernetes-dashboard-9k5vl -n kube-system
kubectl logs -f pods/kube-dns-910330662-653vt -n kube-system
,我们发现这几个服务依赖的 images 没有拉取下来,又被墙了。。。 解决方案就是搭梯子或找替代 image。
替代各依赖的 images docker pull wymr/kubernetes-dashboard-amd64-v1.6.3:v1.6.3 docker tag wymr/kubernetes-dashboard-amd64-v1.6.3:v1.6.3 gcr.io/google_containers/kubernetes-dashboard-amd64:v1.6.3 docker pull googlecontainer/kube-addon-manager:v6.4-beta.2 docker tag googlecontainer/kube-addon-manager:v6.4-beta.2 gcr.io/google-containers/kube-addon-manager:v6.4-beta.2 docker pull zhaoqing/k8s-dns-dnsmasq-nanny-amd64:1.14.4 docker tag zhaoqing/k8s-dns-dnsmasq-nanny-amd64:1.14.4 gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64:1.14.4 docker pull zhaoqing/k8s-dns-kube-dns-amd64:1.14.4 docker tag zhaoqing/k8s-dns-kube-dns-amd64:1.14.4 gcr.io/google_containers/k8s-dns-kube-dns-amd64:1.14.4 docker pull zhaoqing/k8s-dns-sidecar-amd64:1.14.4 docker tag zhaoqing/k8s-dns-sidecar-amd64:1.14.4 gcr.io/google_containers/k8s-dns-sidecar-amd64:1.14.4
好了,通过替换上边几个依赖的镜像之后,稍等一会,我们就会发现服务都正常启动起来了。
$ kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE kube-addon-manager-minikube 1/1 Running 1 1d kube-dns-910330662-653vt 3/3 Running 1 1d kubernetes-dashboard-9k5vl 1/1 Running 1 1d
此时我们通过 minikube dashboard
或者 minikube dashboard --url
浏览器访问 dashboard 地址,就可以正常打开监控页面了。
9、Heapster 插件安装
上边默认安装后的 Kubernetes Dashboard,是无法图形化展现集群度量指标信息的,此时我们可以通过插件 Heapser,图形化展示集群的信息,这样监控页面就更加直观明了。
首先我们去 GitHub 下载 Heapster 最新稳定版代码到本地指定目录,然后通过 yaml 文件创建并启动各个服务。这里我们选择 InfluxDB 作为后端数据存储,Grafana 作为图形化展示。
$ cd /Users/wanyang3/docker/kubernetes/ $ git clone https://github.com/kubernetes/heapster.git $ ls -l deploy/kube-config/influxdb/ total 24 -rw-r--r-- 1 wanyang3 staff 2291 10 19 14:49 grafana.yaml -rw-r--r-- 1 wanyang3 staff 1162 10 20 15:01 heapster.yaml -rw-r--r-- 1 wanyang3 staff 974 10 19 14:49 influxdb.yaml
这里要注意一下,这三个 yaml 文件分别对应 heapster、influxdb 和 grafana,他们都分别需要依赖对应的 images,由于网络的问题,要么搭梯子或者替换镜像。
依赖镜像入下: gcr.io/google_containers/heapster-amd64:v1.4.0 gcr.io/google_containers/heapster-influxdb-amd64:v1.3.3 gcr.io/google_containers/heapster-grafana-amd64:v4.4.3 替换镜像如下: docker pull wanghkkk/heapster-amd64-v1.4.0:v1.4.0 docker pull wanghkkk/heapster-influxdb-amd64-v1.3.3:v1.3.3 docker pull wanghkkk/heapster-grafana-amd64-v4.4.3:v4.4.3
可对应上边 yaml 文件分别修改 image 为以上对应镜像,也可以 docker tag ...
改成对应镜像名。修完完毕之后,可以通过命令创建 pod 了。
$ kubectl create -f deploy/kube-config/influxdb/ delpoyment "heapster" created service "heapster" created deployment "monitoring-influxdb" created service "monitoring-influxdb" created deployment "monitoring-grafana" created service "monitoring-grafana" created $ kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE heapster-3848557544-1548b 1/1 Running 0 1d kube-addon-manager-minikube 1/1 Running 0 1d kube-dns-910330662-653vt 3/3 Running 0 1d kubernetes-dashboard-9k5vl 1/1 Running 0 1d monitoring-grafana-2175968514-7tl3w 1/1 Running 0 1d monitoring-influxdb-1957622127-x28mz 1/1 Running 0 1d
好了,Heapster 插件已经启动完毕了,如果一切正常的话,稍等几分钟(也不一定哈,我的就等了差不多20分钟才出来。。。),采集数据需要些时间,再次刷新 dashboard,就能看到集群度量指标信息将以图形化方式展现出来。
但是,如果你等了很长时间,Dashboard 还是更以前一样,没有任何变化的话,那很有可能是服务并没有正确运行起来,我们可以通过查看日志来排查原因。
$kubectl logs -f pod/monitoring-grafana-2175968514-7tl3w -n kube-system $kubectl logs -f pod/monitoring-influxdb-1957622127-x28mz -n kube-system $kubectl logs -f pod/heapster-3848557544-1548b -n kube-system
通过日志可以发现,在 heapster-3848557544-1548b 这个 pod 的日志中,发现有错误:
... Failed to list *api.Node: Get https://kubernetes.default/api/v1/nodes?resourceVersion=0: x509: certificate is valid for server, not kubernetes.default ...
通过 heapster.yaml 文件可以看到,
command: - /heapster - --source=kubernetes:https://kubernetes.default - --sink=influxdb:http://monitoring-influxdb.kube-system.svc:8086
默认连接 kubernetes 的数据源地址为 https://kubernetes.default
后端存储数据服务为 http://monitoring-influxdb.kube-system.svc:8086
,但是这里出现了由于认证问题获取 kubernetes 服务失败的情况。
解决方法有两种:
1、通过参考 Github Heapster 配置数据源文档 Heapster source-configuration,修改配置数据源为 --source=kubernetes:http://<address-of-kubernetes-master>:<http-port>?inClusterConfig=false
,采用 insecure-port 的方式连接,因为 kube-apiserver 针对 insecure-port 接入的请求没有任何限制机制。
2、通过命令获取 kubernetes ClusterIP,直接使用 ClusterIP 也是可以的。
$ kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 1d ... 修改 heapster.yaml command: - /heapster #- --source=kubernetes:https://kubernetes.default - --source=kubernetes:https://10.0.0.1 - --sink=influxdb:http://monitoring-influxdb.kube-system.svc:8086
以上两种方式修改配置完成后,使用 kubectl apply -f deploy/kube-config/influxdb/heapster.yaml
重新 apply 一下该 pod。再次稍等几分钟,再次刷新 dashboard,就能看到了。
9、简单演示使用 Dashboard
通过 kubernetes dashboard 我们除了可以直观的查看各种资源信息,日志信息,查看工作负荷信息,监控 CPU 以及内存资源使用率等之外,我们还可以创建部署容器应用,删除各种资源,编辑更新资源文件等等操作。下边就演示下如何在 dashboard 上创建一个容器应用部署,并且编辑更新该部署,最后删除部署信息。
9.1 创建容器应用部署
浏览器打开 kubernetes dashboard 的 Web UI 页面,点击右上角 “+ 创建”,进入创建应用页面,这里有两种方式创建应用,一种是通过页面填写应用详情,二种是上传 YAML 或 JSON 文件的方式。为了方便,我们使用第二种方式,上传本地写好的一个 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
说明一下,这里我创建了一个 Deployment 名为 hello-redis,并归属到 my-kube 的命名空间下,并且指定初始副本数为 2,使用镜像 redis:latest,同时创建了一个 Service 名为 hello-redis,开放 6379 端口,并分别给他们打上对应的 tag 标签。
从上图可以看到已经创建好了 hello-redis 部署,以及初始化的2个副本容器组。
9.2 编辑更新该部署
现在我们将 hello-redis 副本容器组扩大到 4 个,点击左侧 “工作负荷 —》 部署”,右侧会列出当前节点下所有的部署,点击 hello-redis 进入到部署页点击右上角 “编辑”,弹出 Yaml 文件编辑弹框,修改 replicas: 4
,点击 “更新” 即可。也可以在部署列表中 hello-reids 记录最后边操作栏,点击 “查看/编辑 YAML”,弹出框修改。
稍等一会,去 hello-redis 副本集中查看,副本数就变成 4 个了。
9.3 删除部署信息
点击左侧 “工作负荷 —》 部署”,右侧会列出当前节点下所有的部署,点击 hello-redis,进入到部署页点击右上角 “删除”,弹出框点击 “删除” 即可。也可以在部署列表中 hello-reids 记录最后边操作栏,点击 “删除”,弹出框点击 “删除”。
参考资料