作者:AinneJJ | 来源:互联网 | 2023-09-25 14:24
本文讲的是Kubernetes基本要素介绍(下), 【编者的话】Rimas Mocevicius是云计算、 CoreOS 、 Kubernetes 、DEIS和应用程序容器解决方案架构师 。CoreOS Essentials一书作者。目前就职于DEIS。本文是其发表在DEIS上的官方博客,介绍Kubernetes的系列教程的第二篇。
在我的 上一篇博客
中,我介绍了kubectl、控制面板、命名空间、Pod、服务、复制管理器和标签的概念。 这篇博客中,我们继续介绍卷、Secret、滚动升级和Helm。 卷
一个卷就是包含一些数据的目录,它可以被容器作为文件系统的组成部分而使用。卷通常作为存储有状态的应用数据而使用。 Kubernetes支持以下卷类型: - emptyDir
- hostPath
- gcePersistentDisk
- awsElasticBlockStore
- nfs
- iscsi
- glusterfs
- rbd
- gitRepo
- secret
- persistentVolumeClaim
具体细节请参阅 文档
。 在本篇博客中,我们将只涉及其中的一种卷类型:hostPath。 hostPath卷从主机节点的文件系统中挂载一个文件或目录到Pod中。举例来说, 上一篇博客
中我们介绍的Nginx复制控制器可以使用此种类型卷去存储HTML文件。 让我们使用卷配置去更新 nginxrc.yaml
: apiVersion: v1 kind: ReplicationController metadata: name: my-nginx spec: replicas: 1 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 # Mount volume into pod volumeMounts: # must match the name of the volume name below - name: shared-html # mount path within the container mountPath: /usr/share/nginx/html # volumes to be mounted to containers volumes: - name: shared-html hostPath: path: /somepath/shared/html
使用这种复制控制器配置, nginx
容器将从主机挂载的卷来提供HTML文件的访问。 如果你改变副本数量这可能是无效的,因为 /some/shared/html
目录可能不存在于其他节点中。如果你想进行扩展,你需要在Kubernetes节点之间复制这些文件,让他们在所有节点中都是可访问的。或者你可以使用NFS或者GlusterFS的卷类型。 Secret
Secret可能是任何一段敏感的数据,录入授权令牌,加密钥匙,SSL证书,SSH钥匙等。Secret可以被容器访问。将此种信息放在Secret中比放在Pod定义或者Docker镜像中要更安全并更灵活。 想要使用Secret,Pod或者复制控制器需要引用Secret。 下面是一份Secret主文件的例子: apiVersion: v1 kind: Secret metadata: name: mysecrets data: password: dmFsdWUtMg0K username: someuser
创建文件的命令: $ kubectl create -f mysecrecs.yaml
我们可以将它作为一个卷挂载到容器中: ... volumeMounts: # must match the name of the volume name below - name: my-passwords readOnly: true # mount path within the container mountPath: /etc/my-passwords-volume # volumes to be mounted to containers volumes: - name: my-passwords secrect: secrectName: mysecrects
我们的应用现在可以从 /etc/my-passwords-volume
目录中读取 username
和 password
文件。其中包含了你在Secret主文件中定义的值。非常简单。 如果你的应用需要环境变量,一个方法是将环境变量写入这些文件中,然后在应用启动之前读取它们并设置为环境变量。 想知道更多关于Secret的内容,请参阅 文档
。 滚动升级
在 上一篇博客
中,我们了解了如果通过复制管理器来发布Pod。这篇文章中,我们将知道如果做 滚动升级 。举例来说,这可以实现更新Docker镜像的版本。 以下是你要做的: $ kubectl rolling-update my-nginx --image=nginx:1.9.10 Created my-nginx-2088ed66ed908b2434289b30bf3dafe3 Scaling up my-nginx-2088ed66ed908b2434289b30bf3dafe3 from 0 to 3, scalling down Scaling my-nginx-2088ed66ed908b2434289b30bf3dafe3 up to 1 Scaling my-nginx down to 2 Scaling my-nginx-2088ed66ed908b2434289b30bf3dafe3 up to 2 Scaling my-nginx down to 1 Scaling my-nginx-2088ed66ed908b2434289b30bf3dafe3 up to 3 Scaling my-nginx down to 0 Update succeeded. Deleting old controller: my-nginx Renaming my-nginx-2088ed66ed908b2434289b30bf3dafe3 to my-nginx replicationcontroller "my-nginx" rolling updated
我们刚刚通过升级Docker镜像来升级 my-nginx
复制控制器管理的Pod。换句话说,这个过程先删除了老容器,并使用最新的镜像来创建一个新容器。 这只适用于每个复制管理器管理一种Docker镜像的情况。如果你的复制管理器管理多种Dokcer镜像,一个新的复制管理器将被创建。 下面是例子: $ kubectl rolling-update my-nginx -f nginxrc-v2.yaml
以上的命令通过使用在 nginxrc-v2.yaml
主文件中定义的新复制控制器去升级 my-nginx
的Pod。当新的复制控制器生效后,老的将会被删除。 你能在文档中读到更多关于 简单滚动升级
或者 复制管理器滚动升级
的内容。 Helm
Helm
是Kubernetes的包管理器。 我们已经学习了在Kubernetes集群上安装复制管理器和服务。你可以自己编写控制器配置文件,或者也可以用已经预写好的配置文件,这些文件应该是由你进行测试。Helm就是为了后一种场景服务的。 Helm允许你安装 chart 。一个chart对于一个Kubernetes的主文件。这些chart可以被Helm社区共享。 让我们安装Helm: $ mkdir ~/bin $ cd ~/bin $ curl -s https://get.helm.sh | bash
你可以查看可用的命令: helm -h
使用Helm的第一步是从Github上获取最新的chart: $ helm update ---> Creating /home/user/.helm/config.yaml ---> Checking repository charts ---> Cloning into '/home/user/.helm/cache/charts'...Already up-to-date. ---> Done
让我们搜索某一个chart: $ helm search weavescope weavescope - Weave Scope chart
Weave Scope提供了一个你的Docker容器的可视化地图。可以在 官方产品页
中获取更多信息。 我们可以更详细的了解chart中的信息: $ helm info weavescope Name: weavescope Home: http://weave.works/product/scope/ Version: 0.1.1 Description: Weave Scope chart Details: This chart allows to run Weave Scope on Kubernetes
并且我们可以拉取这些chart到我们的工作区中: $ helm fetch weavescope ---> Fetched chart into workspace /home/user/.helm/workspace/charts/weavescope ---> Done
Helm总是保存chart的一份拷贝到 ~/.helm/workspace/charts/目录中
。 所以让我们安装这个Weave Scope chart: $ helm install weavescope ---> Running `kubectl create -f` ... service "weave-scope-app" created replicationcontroller "weave-scope-app" created daemonset "weave-scope-probe" created
---> Done # Weave Scope Using Weave Scope with Kubernetes: https://github.com/weaveworks/scope#using-weave-scope-with-kubernetes If you have a scope.weave.works account and want to run Scope in Cloud Service Mode, comment out the line "$(WEAVE_SCOPE_APP_SERVICE_HOST):$(WEAVE_SCOPE_APP_SERVICE_PORT)"] in scope-probe-ds.yaml manifest and uncomment the line below, replacing "foo" with the Service token which you will obtain when logging in to your scope.weave.works account: "--probe.token=foo"] DaemonSets need to be enabled in Kubernetes cluster and all node hosts are run with the Docker socket at /var/run/docker.sock ========================================
让我们检查复制控制器的工作情况:
$ kubectl get rc weave-scope-app NAME DESIRED CURRENT AGE weave-scope-app 1 1 8m
完美。现在我们应该检查守护进程集的工作情况了:
$ kubectl get ds weave-scope-probe NAME DESIRED CURRENT NODE-SELECTOR AGE weave-scope-probe 3 3 10m
Weave Scope监听4040端口,但是该个端口并没有暴露给我们。所以让我们建立本地端口到远程端口的跳转,这样我们就可以从自己的笔记本电脑上远程访问它了。
获取Pod列表:
$ kubectl get pods NAME READY STATUS RESTARTS AGE weave-scope-app-k8m4k 1/1 Running 0 23m weave-scope-probe-b5jh7 1/1 Running 0 23m weave-scope-probe-psit2 1/1 Running 0 23m
我们感兴趣的是 weave-scope-app
Pod。
我们能像这样增加一个端口跳转:
$ kubectl port-forward weave-scope-app-k8m4k 4040:4040 I0428 18:43:37.014631 14389 portforward.go:213] Forwarding from 127.0.0.1:4040 -> 4040 I0428 18:43:37.015420 14389 portforward.go:213] Forwarding from [::1]:4040 -> 4040
现在我们开以用浏览器打开 http://127.0.0.1:4040
。
你可以看到WeaveScope的界面:
太棒了。所有的东西都能正常工作了!
如果你过后想要卸载Weave Scope,你可以这样做:
$ helm uninstall weavescope -n default
总结
在Kubernetes微教程的第二部分我们介绍了卷、secret、滚动更新和Helm。Helm是Kubernetes的包管理器,并使安装和管理Kubernetes主文件更加容易。
相关阅读
- Kubernetes Overview, Part One by Rimantas Mocevicius ON 27 APR 2016
- Connecting Docker Containers, Part Two by Eddy Mavungu ON 4 MAR 2016
- Connecting Docker Containers, Part One by Eddy Mavungu ON 26 FEB 2016
- CoreOS Overview, Part Three by Rimantas Mocevicius ON 12 FEB 2016
- CoreOS Overview, Part Two by Rimantas Mocevicius ON 5 FEB 2016
- etcd on CoreOS by Nitish Tiwari ON 3 FEB 2016
原文链接:Kubernetes Overview, Part Two (翻译:高洪涛)
===========================================
译者介绍
高洪涛 ,当当网架构师,开源数据库分库分表中间件 Sharding-JDBC 作者。目前从事Docker相关调研工作。
原文发布时间为:2016-05-09
本文作者:gaohongtao
本文来自云栖社区合作伙伴DockerOne,了解相关信息可以关注DockerOne。
原文标题:Kubernetes基本要素介绍(下)