Kubernetes快速入门实战

Kubernetes 生产环境已经运行一年半,踩坑无数之后,趁着现在闲暇之时在这里做一些分享,主要是让初学者能快速上手 Kubernetes。

以下演示所用的环境均为 minikube。

创建集群

首先,查看所使用的 minikube 版本:

$ minikube version
minikube version: v0.25.0

使用的是目前最新的 0.25.0 版本,大家也可以根据自己的需求下载指定版本

启动 minikube:

$ minikube start
Starting local Kubernetes v1.9.0 cluster...
Starting VM...
Getting VM IP address...
Moving files into cluster...
Setting up certs...
Connecting to cluster...
Setting up kubeconfig...
Starting cluster components...
Kubectl is now configured to use the cluster.
Loading cached images from config file.

minikube 启动之后,会创建一个单节点 Kubernetes 集群。

查看集群版本:

$ kubectl version
Client Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.0", GitCommit:"925c127ec6b946659ad0fd596fa959be43f0cc05", GitTreeState:"clean", BuildDate:"2017-12-15T21:07:38Z", GoVersion:"go1.9.2", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"", Minor:"", GitVersion:"v1.9.0", GitCommit:"925c127ec6b946659ad0fd596fa959be43f0cc05", GitTreeState:"clean", BuildDate:"2018-01-26T19:04:38Z", GoVersion:"go1.9.1", Compiler:"gc", Platform:"linux/amd64"}

这里有两个版本,client version 指的是 kubectl 命令行工具的版本,而 server version 才是 Kubernetes 的版本。

查看更详细的版本信息:

$ kubectl cluster-info
Kubernetes master is running at https://172.17.0.77:8443

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

集群所在主机的 ip 为 172.17.0.77。

注意:这里的 master 指的是 Kubernetes 集群的 master 节点(在 Kubernetes 集群中,节点分为两类,一类是 master 节点,一类是 node 节点)。那怎么看到 node 节点呢?

$ kubectl get node
NAME      STATUS    ROLES     AGE       VERSION
host01    Ready     <none>    20m       v1.9.0

host01 就是 node 节点,在当前环境中,实际上只有一台主机。这台主机既作为 master 节点,也作为 node 节点。

部署应用

下面以部署一个 nginx 为例来演示部署应用的过程:

$ kubectl run first-app --image=nginx --port=80
deployment "first-app" created

通过 run 命令创建一个名为 first-app 的 deployment,使用的是 docker hub 上最新的 nginx 镜像,并指定了应用端口为 80。deployment 是干嘛的呢?别急,往下看:

查看当前的 deployment:

$ kubectl get deployment
NAME        DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
first-app   1         1         1            1           1m

查看当前的 pod:

$ kubectl get pod
NAME                        READY     STATUS    RESTARTS   AGE
first-app-6db44b474-dbbtp   1/1       Running   0          4m

当前有一个名为 first-app-6db44b474-dbbtp 的 pod,仔细看看这个 pod 的名称 ,是不是就是刚刚创建的 deployment 的名称加了一串后缀?确实是这样。在 Kubernetes 中,用 deployment 来声明和管理 pod(其实中间还有一层,这里就不展开讲了),而每个 pod 里面包含至少一个 container。

查看更详细的 pod 内容:

$ kubectl describe pod first-app-6db44b474-dbbtp
Name:           first-app-6db44b474-dbbtp
Namespace:      default
Node:           host01/172.17.0.77
Start Time:     Fri, 02 Mar 2018 06:48:02 +0000
Labels:         pod-template-hash=286006030
                run=first-app
Annotations:    <none>
Status:         Running
IP:             172.18.0.4
Controlled By:  ReplicaSet/first-app-6db44b474
Containers:
  first-app:
    Container ID:   docker://54eacc7ff536d7181fa366883f7ed4cf632492ad6ed391207fea436d22d219a9
    Image:          nginx
    Image ID:       docker-pullable://nginx@sha256:4771d09578c7c6a65299e110b3ee1c0a2592f5ea2618d23e4ffe7a4cab1ce5de
    Port:           80/TCP
    State:          Running
      Started:      Fri, 02 Mar 2018 06:48:14 +0000
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-zkqw6 (ro)
Conditions:
  Type           Status
  Initialized    True
  Ready          True
  PodScheduled   True
Volumes:
  default-token-zkqw6:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-zkqw6
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     <none>
Events:
  Type    Reason                 Age   From               Message
  ----    ------                 ----  ----               -------
  Normal  Scheduled              7m    default-scheduler  Successfully assigned first-app-6db44b474-dbbtp to host01
  Normal  SuccessfulMountVolume  7m    kubelet, host01    MountVolume.SetUp succeeded for volume "default-token-zkqw6"
  Normal  Pulling                7m    kubelet, host01    pulling image "nginx"
  Normal  Pulled                 7m    kubelet, host01    Successfully pulled image "nginx"
  Normal  Created                7m    kubelet, host01    Created container
  Normal  Started                7m    kubelet, host01    Started container

当前显示了名为 first-app-6db44b474-dbbtp 的 pod 的 ip、端口、image 以及 pod 生命周期的事件等信息。

对外发布服务

已经部署好了一个 nginx 应用,那么要怎么去访问呢?这时候就需要用到 service。
创建一个 service:

$ kubectl expose deployment/first-app --type="NodePort" --port=80
service "first-app" exposed

查看创建好的名为 first-app 的 service :

$ kubectl get svc first-app
NAME        TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
first-app   NodePort   10.102.0.12   <none>        80:30491/TCP   1m

在 PORT(S) 一栏中,除了 80 端口,后面还有一个 30491 端口。这是使用了“NodePort”类型创建 service 分配的端口,通过主机 ip 和这个端口,就可以访问到这个 service 了。可以使用 curl 工具进行访问:

$ curl 172.17.0.77:30491
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

扩缩应用

刚刚已经成功访问到 nginx 应用,但有些时候,可能需要多个 nginx 来横向扩展,那么在 Kubernetes 中怎么实现呢?

$ kubectl scale deployment/first-app --replicas=3
deployment "first-app" scaled

再查看当前的 pod,可以看到当前已经有了 3 个 first-app 了。

$ kubectl get pod
NAME                        READY     STATUS    RESTARTS   AGE
first-app-6db44b474-6vlrj   1/1       Running   0          39s
first-app-6db44b474-dbbtp   1/1       Running   0          19m
first-app-6db44b474-gjzgg   1/1       Running   0          39s

如果觉得 3 个太浪费资源了,想减少 pod 的数量,那么可以使用同样的命令,把 replicas 参数的值改为需要的值就可以了。

更新应用

最常用的就是更新镜像。之前使用的是 docker hub 上最新的 nginx,现在用 1.10.3 这个比较老的版本来替代最新版本。先查看当前使用的 nginx 版本。这里有一个很简单的方法,访问一个不存在的页面,如下:

$ curl 172.17.0.77:30491/abc
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.13.9</center>
</body>
</html>

当前使用的 nginx 版本是 1.13.9,接下来进行更新操作:

$ kubectl set image deployment/first-app first-app=nginx:1.10
deployment "first-app" image updated

再查看当前 nginx 的版本:

 $ curl 172.17.0.77:30491/abc
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.10.3</center>
</body>
</html>

nginx 版本已经成功更新为 1.10.3。

删除应用

最后来讲讲删除应用,之前是通过 deployment 来创建应用,所以只需要删除 deployment 就可以删除对应的应用了。

$ kubectl delete deployment/first-app
deployment "first-app" deleted

再查看一下当前的 pod:

$ kubectl get pod
No resources found.

所有的 pod 都已经删除了。

本篇简单介绍了 Kubernets 的一些基本操作,后期还会更新 Kubernetes 相关的内容,比如说:

  1. Kubernetes 的核心概念;
  2. 网络方案的选择和配置;
  3. 如何搭建一个高可用的 kubernetes 生产集群;
  4. 日志/监控方案的选择;
  5. 集群故障排除;

包括但不仅限于上述内容,感兴趣的小伙伴,可以多多关注。谢谢支持!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,978评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,954评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,623评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,324评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,390评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,741评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,892评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,655评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,104评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,569评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,254评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,834评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,725评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,950评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,260评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,446评论 2 348

推荐阅读更多精彩内容