逆向引用 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 名}-{编号}。