逆向引用 Kubernetes 对象

前提条件

我开始使用Kubernetes,但官方文档太难懂了,所以我按照目的进行了整理。

我想在每个节点上启动容器。

使用守护进程集(Daemon Set)。
在下面的例子中,通过守护进程集在主机的 /var/log/myapp 目录监视输出的 myapp.log 文件,并在 logstash 容器中进行处理。为简化起见,Logstash 直接输出文件的内容。通常会结合 Filter 插件进行处理,然后通过 Output 插件发送到 Elasticsearch。

+-----------------------------------+
| node                              |
|                     +----------+  |
|                     | logstash |  |
|                     |          |  |
|  /var/log/myapp <-mount-*/log  |  |
|                     +----------+  |
+-----------------------------------+
kind: DaemonSet
apiVersion: extensions/v1beta1
metadata:
  name: logstash
spec:
  template:
    metadata:
      labels:
        app: daemon
    spec:
      volumes:
      - name: log
        hostPath:
          path: /var/log/myapp
      containers:
      - name: logstash # ホストの /var/log/myapp/myapp.log を出力するだけのコンテナ
        image: logstash
        args:
        - -e
        - |
          input {
            file { path => '/log/myapp.log' }
          }
          output {
            stdout { codec => rubydebug }
          }
        volumeMounts:
        - name: log # ホストの /var/log/myapp ディレクトリに当たる
          mountPath: /log

我想在容器之间进行查询。

当我们希望从一个容器向另一个容器进行查询(多对一情况下)。

使用Service。
利用Pod可以解析与Service对应的Pod名称。
在下面的示例中,logstash容器将日志发送到elasticsearch容器中的/log/myapp.log路径。为简化起见,我们在/log/myapp.log路径上每30秒创建一个写入hello的容器。通常情况下,我们会创建一个将日志输出到/log/myapp.log路径的应用程序。
通过使用Service,logstash容器现在可以通过名称elasticsearch查询elasticsearch容器。

+---------------+     +---------------+      +---------------+
| [ReplicaSet]  |     | [Service]     |      | [Pod]         |
|  +----------+ |     | elasticsearch |      | elasticsearch |
|  | [Pod]    | |     |               |      |               |
|  | logstash *----+--*name resolution*----->*:9200/tcp      |
|  +----------+ |  |  +---------------+      +---------------+
|  | [Pod]    | |  |
|  | logstash *----+
|  +----------+ |  |
|  | [Pod]    | |  |
|  | logstash *----+
|  +----------+ |
+---------------+
kind: Service
apiVersion: v1
metadata:
  name: elasticsearch
spec:
  selector:
    app: elasticsearch
  ports:
  - port: 9200
    targetPort: 9200
---
kind: Pod
apiVersion: v1
metadata:
  name: elasticsearch
  labels:
    app: elasticsearch
spec:
  containers:
  - name: elasticsearch
    image: elasticsearch:2.4.1 # 5.0 だと起動に失敗したので前バージョン
    ports:
    - containerPort: 9200
---
kind: ReplicaSet
apiVersion: extensions/v1beta1
metadata:
  name: logstash
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: logstash
    spec:
      volumes:
      - name: log
      containers:
      - name: logstash # /log/myapp.log のログを elasticsearch に送るだけのコンテナ
        image: logstash:2.4.0-1 # Elasticsearch に合わせたバージョン
        args:
        - -e
        - |
          input {
            file { path => '/log/myapp.log' }
          }
          output {
            stdout {
              codec => rubydebug
            }
            elasticsearch {
              hosts => ['elasticsearch']
            }
          }
        volumeMounts:
        - name: log
          mountPath: /log
      - name: hello # /log/myapp.log に hello と30秒毎に書き込むだけのコンテナ
        image: centos
        args:
        - bash
        - -c
        - |
          while true; do
            echo hello >> /log/myapp.log
            sleep 30
          done
        volumeMounts:
        - name: log
          mountPath: /log

另外,要查看从Logstash发送到Elasticsearch的日志,请

kubectl run -it --rm centos --image centos

在一个启动bash的容器中,

curl elasticsearch:9200/logstash-*/_search?pretty

只需执行它即可。容器退出并终止bash时,它将自动删除。

我想在容器之间进行查询(一对一的情况下)。

可以使用Service,但使用Pod更简单。
其他容器可以在Pod内使用localhost进行查询。
以下示例中,将Elasticsearch和Kibana一起设置。

kind: Pod
apiVersion: v1
metadata:
  name: ek
  labels:
    app: ek
spec:
  containers:
  - name: elasticsearch
    image: elasticsearch:2.4.1 # 5.0 だと起動に失敗したので前バージョン
  - name: kibana
    image: kibana:4.6.2 # Elasticsearch に合わせたバージョン
    env:
    - name: ELASTICSEARCH_URL
      value: http://localhost:9200 # elasticsearch コンテナに繋がる
    ports:
    - containerPort: 5601

我想从集群外访问容器。

如果集群的节点只有一台

使用NodePort类型的Service。
NodePort类型允许通过容器启动的节点的IP地址进行访问。
在下面的示例中,我们可以通过http://(节点的IP地址):30601来访问之前创建的Kibana。

    • もちろん、ファイアウォールやセキュリティグループなどが間にあれば

 

    • 接続を許可する設定が必要になる。

 

    • ちなみに、ポート番号が30601になっているのは、

 

    • ノードで使用可能なポート番号が

 

    デフォルトでは30000~32767に設定されているためである。
kind: Service
apiVersion: v1
metadata:
  name: ek-svc
spec:
  ports:
  - port: 5601
    targetPort: 5601
    nodePort: 30601
  selector:
    app: ek
  type: NodePort

如果有多个集群节点

在Kubernetes外部购买负载均衡器。
在类似Google Container Engine的云服务中,
通过使用LoadBalancer类型的Service
来支持负载均衡器的创建。
在下面的例子中,可以通过 http://{负载均衡器的IP地址}:5601
来访问之前创建的Kibana。

kind: Service
apiVersion: v1
metadata:
  name: ek-lb
spec:
  ports:
  - port: 5601
    targetPort: 5601
  selector:
    app: ek
  type: LoadBalancer

我想增加集装箱的数量

使用复制集(Replica Set)和作业(Job)。
复制集使用持续运行的容器。
作业使用预计完成的容器。

复制集合

只要指定数量的容器正在运行,复制集将持续运行。适用于类似守护进程的情况,其中预计处理不会结束。

工作

工作将持续新建容器,直到满足指定次数退出代码为0的容器数量。与像批处理一样,与守护进程不同的是,它用于在预计处理结束的情况下使用。

当您拉取Docker镜像时,希望进行身份验证。

使用秘密。

按照公式文档中的步骤,首先需要创建一个“Secret”,然后使用该“Secret”来进行镜像拉取的设置即可。

可以使用以下命令创建秘密。

kubectl create secret docker-registry

比如说,

kubectl create secret docker-registry my-secret --docker-username=myname --docker-password=mypass --docker-email=myname@example.com

可以使用名为my-secret的Secret创建Secret。
这个Secret将包含上述信息的Base64编码数据,
因此必须谨慎对待和处理。

接下来,将其设定为使用 Secret。

如果您在拉取图像时希望默认使用上述的认证信息,就需要在Service Account中设置密钥。
每个Namespace都会有一个对应的Service Account,其中的对象默认使用该Service Account,因此您需要在那里添加设置。

如果要将默认命名空间的默认服务帐户进行设置,则可以这样做。

kubectl edit sa default

年月日和(sa 为serviceaccount的别名),编辑器启动后,

imagePullSecrets:
- name: my-secret

在编辑器中添加并保存”を末尾に追加し、保存してエディタを終了する”。

如果想要为每个 Pod 分配不同的 Secret,请按照以下示例为 Pod 设置 Secret。

kind: Pod
apiVersion: v1
metadata:
  name: sample-foo
spec:
  containers:
  - name: sample-foo
    image: httpd
  imagePullSecrets:
  - name: my-secret

我希望对集装箱进行编号以进行管理。

使用有状态集。

要想知道容器自己的编号,需要从主机名中提取出来。
主机名的格式是 {Stateful Set 名}-{编号}。

bannerAds