初试 minikube 本地部署运行 kubernetes 实例

目录

  • 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

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

参考资料

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云计算

如何在Kubernetes群集上安装,配置和部署NGINX

Kubernetes是一个基于Google Borg的开源容器管理系统。它可以配置为提供高度可用的,水平自动缩放的自动部署。本指南介绍如何在Linode上设置K...

2053
来自专栏大魏分享(微信公众号:david-share)

上酒桌,今儿咱保证把容器SDN的这事一把唠清楚!

容器的SDN 很多人都说2017将是容器年,大卫也这么认为。但在很长一点时间里,容器与虚拟化都是相互依存,相互补充的问题。 之前笔者发表过一篇文章,放开眼界,看...

2775
来自专栏性能与架构

认识一下 Kubernetes

2303
来自专栏blackpiglet

OpenStack(Pike)连接 Ceph RBD

请注意,本文档假设 Ceph 和 OpenStack 环境已经可用,在此基础上,配置 OpenStack 使用 Ceph RBD 作为镜像和卷的后端存储。

923
来自专栏散尽浮华

由索引节点(inode)爆满引发的问题

关于磁盘空间中索引节点爆满的问题还是挺多的,借此跟大家分享一下: 一、发现问题 在公司一台配置较低的Linux服务器(内存、硬盘比较小)的/data分区内创建...

2108
来自专栏轻量级微服务

Kubernetes 环境搭建 - CentOS

三台 CentOS 7.4 服务器:kube1 、kube2 、kube3 ,配置:2 核 16G

821
来自专栏iOS 开发杂谈

学习笔记之git命令行的详细使用

git仓库,你可以简单理解成一个目录,这个目录里面的所有文件都可以被git仓库管理起来,每个文件的修改、删除,git都能跟踪,以便任何时刻都可以追踪历史,或者在...

662
来自专栏北京马哥教育

网络常见的9大命令,非常实用!

ping是个使用频率极高的实用程序,主要用于确定网络的连通性。这对确定网络是否正确连接,以及网络连接的状况十分有用。简单的说,ping就是一个测试程序,如果pi...

1040
来自专栏开发技术

主从热备+负载均衡(LVS + keepalived)

  淘宝架构师李智慧大牛的书籍《大型网站技术架构》以及旭龙兄的博客 ---》【大型网站技术实践】初级篇:借助LVS+Keepalived实现负载均衡。

1062
来自专栏大数据-Hadoop、Spark

解决Linux克隆后eth0不见的问题

1.通过VMware WorkStation的clone功能,克隆了一份Linux虚拟机,主机名为:mini2,执行ifconfig -a查看所有网卡信息,发现...

2514

扫码关注云+社区