手机版
你好,游客 登录 注册 搜索
背景:
阅读新闻

Minikube 本地部署运行 kubernetes 实例详解

[日期:2018-01-19] 来源:Linux社区  作者:aixiaoyang168 [字体: ]

目录

  • kubernetes 介绍
  • 环境、软件准备
  • kubectl 安装
  • minikube 安装
  • 部署运行实例

1、kubernetes 介绍

Kubernetes 是 Google 开源的容器集群管理系统,它构建在目前流行的 Docker 技术之上,为容器化的应用提供资源调度、部署运行、服务发现、扩容缩容等一整套功能。而就在日前 DockerCon 欧洲大会上, Docker 宣布拥抱支持 Kubernetes,Docker 公司计划提供一个无缝平台,同时支持包含 Swarm 和 Kubernetes 集群的异构部署。minikube 是一个使我们很容易在本地运行 kubernetes 的工具,他是通过在本机 VM 里运行一个单节点集群,大大方便学习和使用 kubernetes。

2、环境、软件准备

本次演示环境,我是在本机 MAC OS 以及虚拟机 Linux CentOS7 上操作,以下是安装的软件及版本:

  1. Docker: version 17.09.0-ce
  2. Oracle VirtualBox: version 5.1.20 r114628 (Qt5.6.2)
  3. Minikube: version v0.22.2
  4. 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 安装

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
  • 1

安装完毕后,执行 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 插件

参考资料

本文永久更新链接地址http://www.linuxidc.com/Linux/2018-01/150440.htm

linux
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款