目录
- kubernetes 介绍
- 环境、软件准备
- kubectl 安装
- minikube 安装
- 部署运行实例
1、kubernetes 介绍
Kubernetes 是 Google 开源的容器集群管理系统,它构建在目前流行的 Docker 技术之上,为容器化的应用提供资源调度、部署运行、服务发现、扩容缩容等一整套功能。而就在日前 DockerCon 欧洲大会上, Docker 宣布拥抱支持 Kubernetes,Docker 公司计划提供一个无缝平台,同时支持包含 Swarm 和 Kubernetes 集群的异构部署。minikube 是一个使我们很容易在本地运行 kubernetes 的工具,他是通过在本机 VM 里运行一个单节点集群,大大方便学习和使用 kubernetes。
2、环境、软件准备
本次演示环境,我是在本机 MAC OS 以及虚拟机 Linux Centos7 上操作,以下是安装的软件及版本:
- Docker: version 17.09.0-ce
- Oracle VirtualBox: version 5.1.20 r114628 (Qt5.6.2)
- Minikube: version v0.22.2
- Kuberctl:
- Client Version: v1.8.1
- Server Version: v1.7.5
注意:Minikube 启动的单节点 k8s Node 实例是需要运行在本机的 VM 虚拟机里面,所以需要提前安装好 VM,这里我选择 Oracle VirtualBox。k8s 运行底层使用 Docker 容器,所以本机需要安装好 Docker 环境,这里忽略 Docker、VirtualBox 的安装过程,着重介绍下 Minikube 和 Kuberctl 的安装。
3、 kubectl 安装
kubectl 是 Kubernetes 的命令行工具,我们可以使用该工具查看集群资源,创建、更新、删除各个组件等等,同时提供了非常详细的使用文档,非常方便,那我们在本机 Mac 上安装一下。
安装方式有两种:
一、通过 curl 安装
curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
2、赋二进制文件执行权限chmod +x ./kubectl
3、将二进制文件移到 PATH 中sudo mv ./kubectl /usr/local/bin/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-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
# 替换镜像
$ 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 插件。
参考资料