初试 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 条评论
登录 后参与评论

相关文章

来自专栏jeremy的技术点滴

基于Docker for macOS的Kubernetes本地环境搭建与应用部署

5924
来自专栏张戈的专栏

Linux:10个实用的网络和监控命令

本文列出了 10 个基础的每个 Linux 用户都应该知道的网络和监控命令。网络和监控命令类似于这些: hostname, ping, ifconfig, iw...

3373
来自专栏蜉蝣禅修之道

CentOS6.4 单网卡部署PPTP VPN服务器

1892
来自专栏乱炖

国内主机安装kubenetes1.9.0

链接:https://pan.baidu.com/s/1kjhCqh5DlcBHkqRyHOx8oQ 密码:9dma

2208
来自专栏云计算教程系列

如何在UFW、FirewallD、IPTable为Docker Swarm集群配置防火墙

Docker Swarm 是 Docker 官方三剑客项目之一,提供 Docker 容器集群服务,是 Docker 官方对容器云生态进行支持的核心方案。

1338
来自专栏java闲聊

Error response from daemon: dial tcp: lookup index.docker.io on : i/o timeout

ps:有时候docker重启会恢复这个网络配置,留意下(在新版本中第二种方法会不奏效,推送的更新谨慎升级)

813

将Java EE应用程序部署到Docker Swarm集群

Docker Swarm为Docker提供本地集群。 使用Docker Swarm 0.2.0的集群一文提供了对Docker Swarm的基本介绍,以及如何创建...

2799
来自专栏Ken的杂谈

【Hyper-V教程】三、网络设置:解决虚拟机上网问题

1361
来自专栏Python中文社区

每天一个Linux命令:telnet

telnet telnet命令通常用来远程登录。telnet程序是基于TELNET协议的远程登录客户端程序。Telnet协议是TCP/IP协议族中的一员,是In...

1969
来自专栏上善若水

003工具及环境之ubuntu win7使用NFS共享

本来打算使用samba,但是配置后,发现在linux下访问正常,但是在window拒绝访问,输入密码后报没有权限。 预示改用nfs。

914

扫码关注云+社区