はじめに
Fluentdの公式ページからKubernetesのログ取得をするためには以下のGithubのYAMLを利用せよとあったので
fluent/fluentd-kubernetes-daemonset
その中のfluentd-daemonset-syslog.yamlを実際に適用してみました。尚、Syslogの受け手にはLinuxサーバを用意しています。
環境情報
# cat /etc/os-release NAME="Red Hat Enterprise Linux Server" VERSION="7.9 (Maipo)"
利用したYAML
権限周りとデーモンセットの計4つのオブジェクトを適用します。変更しないとkube-system
に展開される点はご注意ください。
apiVersion: v1 kind: ServiceAccount metadata: name: fluentd namespace: kube-system labels: k8s-app: fluentd-logging version: v1
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: fluentd rules: - apiGroups: - "" resources: - pods - namespaces verbs: - get - list - watch
kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: fluentd roleRef: kind: ClusterRole name: fluentd apiGroup: rbac.authorization.k8s.io subjects: - kind: ServiceAccount name: fluentd namespace: kube-system
apiVersion: apps/v1 kind: DaemonSet metadata: name: fluentd namespace: kube-system labels: k8s-app: fluentd-logging version: v1 spec: selector: matchLabels: k8s-app: fluentd-logging template: metadata: labels: k8s-app: fluentd-logging version: v1 spec: serviceAccount: fluentd serviceAccountName: fluentd tolerations: - key: node-role.kubernetes.io/master effect: NoSchedule containers: - name: fluentd image: fluent/fluentd-kubernetes-daemonset:v1-debian-syslog env: - name: SYSLOG_HOST value: "sysloghost" - name: SYSLOG_PORT value: "514" - name: SYSLOG_PROTOCOL value: "udp" resources: limits: memory: 200Mi requests: cpu: 100m memory: 200Mi volumeMounts: - name: varlog mountPath: /var/log - name: dockercontainerlogdirectory mountPath: /var/log/pods readOnly: true terminationGracePeriodSeconds: 30 volumes: - name: varlog hostPath: path: /var/log - name: dockercontainerlogdirectory hostPath: path: /var/log/pods
daemonset側ではSyslogサーバの情報を入れる箇所があるのでIPアドレスを入れた上でプロトコルもTCPに変更しました。
- name: SYSLOG_HOST value: "10.XX.XX.XX" - name: SYSLOG_PORT value: "514" - name: SYSLOG_PROTOCOL value: "tcp"
動作確認
Linux側でrsyslogが動いている状態で
# systemctl status rsyslog ● rsyslog.service - System Logging Service Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled; vendor preset: enabled) Active: active (running) since ...
YAMLを適用すると
$ kubectl apply -f fluentd-daemonset-syslog.yaml serviceaccount/fluentd unchanged clusterrole.rbac.authorization.k8s.io/fluentd unchanged clusterrolebinding.rbac.authorization.k8s.io/fluentd unchanged daemonset.apps/fluentd configured
正常にPodがNodeの数だけ起動されます。
$ kubectl get ds fluentd -n kube-system NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE fluentd 3 3 3 3 3 <none> ..
同Podのログを見るとNodeからコンテナのログを取得をしていますがパターンマッチの部分に失敗をしていますが
xx +0000 [warn]: #0 [in_tail_container_logs] pattern not matched: ".. stdout
Linux側のmessagesログにはWorekernodeのIP経由で出力されていました。
終わりに
本格的に利用するためにはfluetnd側の設定をカスタマイズする必要がありますが(Configmapで設定ファイルを作ってボリュームマウント)、fluentdの基本的な動作原理は同YAMLで確認することができます。また、特に設定を変更しなくてもSyslogにコンテナログを送る部分は機能するので、疎通確認観点でも利用できました。
以上です。