目录
1、kubernetes 介绍
Kubernetes 是 Google 开源的容器集群管理系统,它构建在目前流行的 Docker 技术之上,为容器化的应用提供资源调度、部署运行、服务发现、扩容缩容等一整套功能。而就在日前 DockerCon 欧洲大会上, Docker 宣布拥抱支持 Kubernetes,Docker 公司计划提供一个无缝平台,同时支持包含 Swarm 和 Kubernetes 集群的异构部署。minikube 是一个使我们很容易在本地运行 kubernetes 的工具,他是通过在本机 VM 里运行一个单节点集群,大大方便学习和使用 kubernetes。
2、环境、软件准备
本次演示环境,我是在本机 MAC OS 以及虚拟机 Linux Centos7 上操作,以下是安装的软件及版本:
注意:Minikube 启动的单节点 k8s Node 实例是需要运行在本机的 VM 虚拟机里面,所以需要提前安装好 VM,这里我选择 Oracle VirtualBox。k8s 运行底层使用 Docker 容器,所以本机需要安装好 Docker 环境,这里忽略 Docker、VirtualBox 的安装过程,着重介绍下 Minikube 和 Kuberctl 的安装。
3、 kubectl 安装
kubectl 是 Kubernetes 的命令行工具,我们可以使用该工具查看集群资源,创建、更新、删除各个组件等等,同时提供了非常详细的使用文档,非常方便,那我们在本机 Mac 上安装一下。
安装方式有两种:
一、通过 curl 安装
1、安装最新版
curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/darwin/amd64/kubectl
# 安装指定版本,例如 v1.8.0
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.8.0/bin/darwin/amd64/kubectl
2、赋二进制文件执行权限
chmod +x ./kubectl
3、将二进制文件移到 PATH 中
sudo mv ./kubectl /usr/local/bin/kubectl
二、通过 Homebrew 安装
brew install kubectl
安装完毕后,执行 kubectl version
查看版本以及是否安装成功。我们可以通过 kubectl help
查看说明文档。
4、minikube 安装
minikube 是一个使我们很容易在本地运行 kubernetes 的工具,他是通过在本机 VM 里运行一个单节点 kubernetes 集群,这对于新手想了解和学习 kubernetes 提供了很大的帮助。所以在安装 minikube 之前我们需要在本机先安装 VM,这里我选择 VirtualBox 忽略安装过程,以下是可选 VM 列表:
minikube 的安装也很简单。
1、curl 方式安装
OSX 系统:
curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.22.3/minikube-darwin-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
Linux 系统:
curl -Lo minikube https://storage.googleapis.com/minikube/releases/v0.22.3/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
2、若上边地址被墙了,可以去 GitHub 上下载安装包,在执行。
下载最新版安装包,各系统对应地址如下:
然后执行 chmod +x minikube && sudo mv minikube /usr/local/bin/
,即可完成安装。安装完毕后,执行 minikube version
查看版本以及是否安装成功。我们可以通过 minikube help
查看说明文档。
5、部署运行实例
好了,环境我们已经安装完毕,现在来演示运行一个实例,这里我已 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
好了,先介绍这么多,下一篇继续介绍下通过 minikube 安装 Kubernetes Dashboard 并集成 Heapster 插件。
参考资料