(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【fluetnd】Syslog経由でログを送るDaemonSetのyamlを適用してみた

スポンサーリンク

はじめに

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にコンテナログを送る部分は機能するので、疎通確認観点でも利用できました。

以上です。