2019年7月31日水曜日

Nodeの詳細情報の取得

# kubectl describe node rasp-node1

書式:kubectl describe node [node名]

=====================================================================================
Name:               rasp-node1
Roles:              <none>
Labels:             beta.kubernetes.io/arch=arm
                    beta.kubernetes.io/os=linux
                    kubernetes.io/arch=arm
                    kubernetes.io/hostname=rasp-node1
                    kubernetes.io/os=linux
Annotations:        flannel.alpha.coreos.com/backend-data: {"VtepMAC":"02:0c:0c:8f:a3:a7"}
                    flannel.alpha.coreos.com/backend-type: vxlan
                    flannel.alpha.coreos.com/kube-subnet-manager: true
                    flannel.alpha.coreos.com/public-ip: 192.168.13.4
                    kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock
                    node.alpha.kubernetes.io/ttl: 0
                    volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp:  Wed, 12 Jun 2019 11:46:23 +0900
Taints:             <none>
Unschedulable:      false
Conditions:
  Type             Status  LastHeartbeatTime                 LastTransitionTime                Reason                       Message
  ----             ------  -----------------                 ------------------                ------                       -------
  MemoryPressure   False   Wed, 31 Jul 2019 13:40:35 +0900   Wed, 12 Jun 2019 11:46:23 +0900   KubeletHasSufficientMemory   kubelet has sufficient memory available
  DiskPressure     False   Wed, 31 Jul 2019 13:40:35 +0900   Wed, 12 Jun 2019 11:46:23 +0900   KubeletHasNoDiskPressure     kubelet has no disk pressure
  PIDPressure      False   Wed, 31 Jul 2019 13:40:35 +0900   Wed, 12 Jun 2019 11:46:23 +0900   KubeletHasSufficientPID      kubelet has sufficient PID available
  Ready            True    Wed, 31 Jul 2019 13:40:35 +0900   Wed, 19 Jun 2019 10:14:12 +0900   KubeletReady                 kubelet is posting ready status. WARNING: CPU hardcapping unsupported
Addresses:
  InternalIP:  192.168.13.4
  Hostname:    rasp-node1
Capacity:
 cpu:                4
 ephemeral-storage:  29727484Ki
 memory:             999036Ki
 pods:               110
Allocatable:
 cpu:                4
 ephemeral-storage:  27396849210
 memory:             896636Ki
 pods:               110
System Info:
 Machine ID:                 763f5aa62bb74829b749c104c6ba4423
 System UUID:                763f5aa62bb74829b749c104c6ba4423
 Boot ID:                    381a7f82-a631-48e7-a866-706e30a1a3a9
 Kernel Version:             4.19.50-v7+
 OS Image:                   Raspbian GNU/Linux 9 (stretch)
 Operating System:           linux
 Architecture:               arm
 Container Runtime Version:  docker://18.9.0
 Kubelet Version:            v1.14.3
 Kube-Proxy Version:         v1.14.3
PodCIDR:                     10.244.1.0/24
Non-terminated Pods:         (13 in total)
  Namespace                  Name                                     CPU Requests  CPU Limits  Memory Requests  Memory Limits  AGE
  ---------                  ----                                     ------------  ----------  ---------------  -------------  ---
  default                    db-nc-767d7b6b89-ld5v6                   0 (0%)        0 (0%)      0 (0%)           0 (0%)         11m
  default                    myapp-d7dbd6858-rk9p8                    0 (0%)        0 (0%)      0 (0%)           0 (0%)         45h
  default                    myapp-d7dbd6858-sjkkx                    0 (0%)        0 (0%)      0 (0%)           0 (0%)         45h
  default                    wordpress-mysql-5548ff9655-85lcc         0 (0%)        0 (0%)      0 (0%)           0 (0%)         39d
  kube-system                kube-flannel-ds-arm-4rw77                100m (2%)     100m (2%)   50Mi (5%)        50Mi (5%)      49d
  kube-system                kube-proxy-km26s                         0 (0%)        0 (0%)      0 (0%)           0 (0%)         49d
  kube-system                kubernetes-dashboard-57f5b65d67-qzpgz    0 (0%)        0 (0%)      0 (0%)           0 (0%)         41d
  openfaas-fn                leftpad-659fb997-6825l                   0 (0%)        0 (0%)      0 (0%)           0 (0%)         37d
  openfaas-fn                nodeinfo-86f8f9695d-vcmjm                0 (0%)        0 (0%)      0 (0%)           0 (0%)         37d
  openfaas-fn                nslookup-5484f6f8b8-hpqfr                0 (0%)        0 (0%)      0 (0%)           0 (0%)         37d
  openfaas                   alertmanager-96d4c9b7f-xr7w7             0 (0%)        0 (0%)      25Mi (2%)        50Mi (5%)      37d
  openfaas                   nats-784c98db98-gf7kz                    0 (0%)        0 (0%)      0 (0%)           0 (0%)         37d
  openfaas                   queue-worker-c5776978d-sccpq             0 (0%)        0 (0%)      0 (0%)           0 (0%)         37d
Allocated resources:
  (Total limits may be over 100 percent, i.e., overcommitted.)
  Resource           Requests   Limits
  --------           --------   ------
  cpu                100m (2%)  100m (2%)
  memory             75Mi (8%)  100Mi (11%)
  ephemeral-storage  0 (0%)     0 (0%)

Events:              <none>

yaml形式で特定のpodを出力する。

# kubectl get pod -l app -L app
NAME                               READY   STATUS              RESTARTS   AGE     APP
db-nc-767d7b6b89-ld5v6             1/1     Running             0          2m42s   db
myapp-d7dbd6858-dxfkq              1/1     Running             0          44h     myapp
myapp-d7dbd6858-rk9p8              1/1     Running             0          44h     myapp
myapp-d7dbd6858-sjkkx              1/1     Running             0          44h     myapp
nc-7c68f6f7df-h8d6n                0/1     ContainerCreating   0          2m40s   nc
omgwtfssl                          0/1     ContainerCreating   0          2m39s   omgwtfssl
wordpress-76b5d9f5c8-xs44x         1/1     Running             4          39d     wordpress
wordpress-mysql-5548ff9655-85lcc   1/1     Running             1          39d     wordpress



▫️上記で表示されているpod情報を元に、yaml形式で出力を行ってみる。

# kubectl get pods -o yaml wordpress-76b5d9f5c8-xs44x 
================================================================
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2019-06-21T07:26:32Z"
  generateName: wordpress-76b5d9f5c8-
  labels:
    app: wordpress
    pod-template-hash: 76b5d9f5c8
    tier: frontend
  name: wordpress-76b5d9f5c8-xs44x
  namespace: default
  ownerReferences:
  - apiVersion: apps/v1
    blockOwnerDeletion: true
    controller: true
    kind: ReplicaSet
    name: wordpress-76b5d9f5c8
    uid: e4ba6ac1-93f5-11e9-ab4f-b827eb29cf3e
  resourceVersion: "3431463"
  selfLink: /api/v1/namespaces/default/pods/wordpress-76b5d9f5c8-xs44x
  uid: e4d74853-93f5-11e9-ab4f-b827eb29cf3e
spec:
  containers:
  - env:
    - name: WORDPRESS_DB_HOST
      value: wordpress-mysql
    - name: WORDPRESS_DB_PASSWORD
      valueFrom:
        secretKeyRef:
          key: password
          name: mysql-pass
    image: wordpress:4.8-apache
    imagePullPolicy: IfNotPresent
    name: wordpress
    ports:
    - containerPort: 80
      name: wordpress
      protocol: TCP
    resources: {}
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: File
    volumeMounts:
    - mountPath: /var/www/html
      name: wordpress-persistent-storage
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: default-token-pqbtk
      readOnly: true
  dnsPolicy: ClusterFirst
  enableServiceLinks: true
  nodeName: rasp-node2
  priority: 0
  restartPolicy: Always
  schedulerName: default-scheduler
  securityContext: {}
  serviceAccount: default
  serviceAccountName: default
  terminationGracePeriodSeconds: 30
  tolerations:
  - effect: NoExecute
    key: node.kubernetes.io/not-ready
    operator: Exists
    tolerationSeconds: 300
  - effect: NoExecute
    key: node.kubernetes.io/unreachable
    operator: Exists
    tolerationSeconds: 300
  volumes:
  - name: wordpress-persistent-storage
    persistentVolumeClaim:
      claimName: wp-pv-claim
  - name: default-token-pqbtk
    secret:
      defaultMode: 420
      secretName: default-token-pqbtk
status:
  conditions:
  - lastProbeTime: null
    lastTransitionTime: "2019-06-21T07:26:33Z"
    status: "True"
    type: Initialized
  - lastProbeTime: null
    lastTransitionTime: "2019-07-19T04:08:53Z"
    status: "True"
    type: Ready
  - lastProbeTime: null
    lastTransitionTime: "2019-07-19T04:08:53Z"
    status: "True"
    type: ContainersReady
  - lastProbeTime: null
    lastTransitionTime: "2019-06-21T07:26:33Z"
    status: "True"
    type: PodScheduled
  containerStatuses:
  - containerID: docker://2a79538459b0721e2c901f8fcad74415655796568de48d8c0d06725becb0338e
    image: wordpress:4.8-apache
    imageID: docker-pullable://wordpress@sha256:6216f64ab88fc51d311e38c7f69ca3f9aaba621492b4f1fa93ddf63093768845
    lastState:
      terminated:
        containerID: docker://3ad2128df1a9bc70e4805635c4158bc64dd824e3d60353a94ecbcf396708025a
        exitCode: 1
        finishedAt: "2019-07-19T04:08:03Z"
        reason: Error
        startedAt: "2019-07-19T04:07:33Z"
    name: wordpress
    ready: true
    restartCount: 4
    state:
      running:
        startedAt: "2019-07-19T04:08:52Z"
  hostIP: 192.168.13.5
  phase: Running
  podIP: 10.244.2.29
  qosClass: BestEffort
  startTime: "2019-06-21T07:26:33Z"



kubernetes:リソース情報取得(ラベル指定)

以下のラベルの指定したリソース情報の取得方法がある。

-l オプションは、フィルタリングするラベルを指定
-L オプションは、指定したラベルを表示する 


root@rasp-master:/home/pi/k8s/docker-nextcloud# kubectl get pod -l app -L app
================================================================================
NAME                               READY   STATUS    RESTARTS   AGE   APP
myapp-d7dbd6858-dxfkq              1/1     Running   0          44h   myapp
myapp-d7dbd6858-rk9p8              1/1     Running   0          44h   myapp
myapp-d7dbd6858-sjkkx              1/1     Running   0          44h   myapp
wordpress-76b5d9f5c8-xs44x         1/1     Running   4          39d   wordpress

wordpress-mysql-5548ff9655-85lcc   1/1     Running   1          39d   wordpress

2019年7月29日月曜日

kubernetes:セルフヒーリング(障害回復機能)

コンテナ(プロセス)が停止すると、再度コンテナのスケジューリングを実行することで
再作成(デプロイ)される。

kubernetes:スケジューリング

1)各種コンテナんを何処のkubernetes nodeに配置することをスケジューリングと手順を行う
2)Affinity/Anti-Affinity機能を使用することで、kubernetes nodeの性能に応じた配置が可能
         ->SSDが備わっているkubernetes nodeに配置するというような詳細な指定が出来る。
3)特別な指定がない場合は、kubernetes NodeのCPU/メモリなどのリソースの空き状況に従ってスケジュールされる。

2019年7月8日月曜日

Kubernetes 用語集メモ

[用語集メモ]
  • Namespace                             :カーネルリソースの隔離
  • cgroup                                    :リソース制限
  • chroot/pivot_root/Capability    :権限制限
  • OverlayFS                               :ファイルシステムの階層化
  • Network Namespace               :ネットワークの隔離

2019年7月6日土曜日

lazydocker

[仕様用途]
docker/docker-composeのコンテナ環境の状態の表示、ログの表示、コンテナまたはサービスの再起動/削除/再構築などが1つのWindowで実行可能である。


[前提]
dockerとdocker-composeが導入済みであること!!


<Raspberry pi or Linux>
curl https://raw.githubusercontent.com/jesseduffield/lazydocker/master/scripts/install_update_linux.sh | bash


1)以下の方法で、起動を行う。
lazydocker 



[help]
root@rasp-master:~# lazydocker -h
=============================================================
lazydocker - The lazier way to manage everything docker
https://github.com/jesseduffield/lazydocker

  Flags: 
       --version  Displays the program version string.
    -h --help  Displays help with available flag, subcommand, and positional value parameters.
    -c --config  Print the current default config
    -d --debug  a boolean
    -f --file  Specify alternate compose files
============================================================


2)マウスを使うことでカーソルの操作が可能。
(赤枠の箇所を選択すると、変化することが分かる。)

2019年7月2日火曜日

Kubernetes クラスタ の切り替え方法

1)目的のkubernetesクラスタの状況を確認したい場合に以下のコマンドを行うようだ。

kubectl config get-contexts
============================================================
CURRENT   NAME                                                                   CLUSTER                                                                AUTHINFO                                                               NAMESPACE
          docker-for-desktop                                                     docker-for-desktop-cluster                                             docker-for-desktop                                                     
          gke_hardy-position-244307_asia-northeast1-a_nodejs-cluster             gke_hardy-position-244307_asia-northeast1-a_nodejs-cluster             gke_hardy-position-244307_asia-northeast1-a_nodejs-cluster             
          gke_hardy-position-244307_asia-northeast1-b_guestbook                  gke_hardy-position-244307_asia-northeast1-b_guestbook                  gke_hardy-position-244307_asia-northeast1-b_guestbook                  
          gke_hardy-position-244307_asia-northeast1-b_persistent-disk-tutorial   gke_hardy-position-244307_asia-northeast1-b_persistent-disk-tutorial   gke_hardy-position-244307_asia-northeast1-b_persistent-disk-tutorial   
*         gke_hardy-position-244307_asia-northeast1-b_test-disk                  gke_hardy-position-244307_asia-northeast1-b_test-disk                  gke_hardy-position-244307_asia-northeast1-b_test-disk                  
          minikube                                                               minikube                                                               minikube                                                               
=============================================================

* は、現在使用中のkubenetesのクラスタの位置。


2)以下のコマンドで、kubernetesクラスタの切り替えを行う。
     赤文字の箇所が対象のkuberntesクラスタを指定する。

kubectl config use-context gke_hardy-position-244307_asia-northeast1-b_persistent-disk-tutorial
========================================================================
Switched to context "gke_hardy-position-244307_asia-northeast1-b_persistent-disk-tutorial".
========================================================================


2019年7月1日月曜日

gcloudコマンドのインストール方法 for Mac

1)gcloudコマンドのインストールを行う。
curl https://sdk.cloud.google.com | bash
gcloud init
exec -l $SHELL
which gcloud

2)gclouコマンドの初期化を行う。
gcloud init

3)自宅のMacとGCPに接続する手続きを行う。
ssh-keygen -t rsa -C "メールアドレス"
ssh -i ~/.ssh/id_rsa メールアドレス@IPアドレス

4)kubectlコマンドのインストを行う。
gcloud components update kubectl

5)念のため、gcloudコマンドのアップデートを行う。
gcloud components update


[その他:メモ]
gcloud config list
=====================================
[compute]
region = asia-northeast1
zone = asia-northeast1-b
[core]
account = **************
disable_usage_reporting = False
project = hardy-position-*******
====================================

以下、アカウントリスト
gcloud auth list
==============================================
  Credentialed Accounts
ACTIVE  ACCOUNT
        d*****e@gmail.com
*       n******@gmail.com

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
=============================================

k8s for GCP (wordpressデプロイ)

[目的]
raspberry piでのk8sをメインで検証してきたので、GCPで検証してみる。

今回、自宅のMac経由で、GCPで接続して、kubernetesでwordpressをデプロイしてみる。
(gcloudコマンドなどのインストールや初期設定については割愛。)


[手順]
1)wordpressのマニフェストのサンプルをダウンロードする。
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
cd kubernetes-engine-samples/wordpress-persistent-disks


2)永続ディスクのコンテナの作成を行う。(ノードを2つ)
gcloud container clusters create persistent-disk-tutorial --num-nodes=2
==================================================================================================
WARNING: In June 2019, node auto-upgrade will be enabled by default for newly created clusters and node pools. To disable it, use the `--no-enable-autoupgrade` flag.
WARNING: Starting in 1.12, new clusters will have basic authentication disabled by default. Basic authentication can be enabled (or disabled) manually using the `--[no-]enable-basic-auth` flag.
WARNING: Starting in 1.12, new clusters will not have a client certificate issued. You can manually enable (or disable) the issuance of the client certificate using the `--[no-]issue-client-certificate` flag.
WARNING: Starting in 1.12, default node pools in new clusters will have their legacy Compute Engine instance metadata endpoints disabled by default. To create a cluster with legacy instance metadata endpoints disabled in the default node pool, run `clusters create` with the flag `--metadata disable-legacy-endpoints=true`.
WARNING: The Pod address range limits the maximum size of the cluster. Please refer to https://cloud.google.com/kubernetes-engine/docs/how-to/flexible-pod-cidr to learn how to optimize IP address allocation.
This will enable the autorepair feature for nodes. Please see https://cloud.google.com/kubernetes-engine/docs/node-auto-repair for more information on node autorepairs.
Creating cluster persistent-disk-tutorial in asia-northeast1-b... Cluster is being health-checked...  
NAME                      LOCATION           MASTER_VERSION  MASTER_IP       MACHINE_TYPE   NODE_VERSION   NUM_NODES  STATUS
persistent-disk-tutorial  asia-northeast1-b  1.12.8-gke.10   104.198.89.185  n1-standard-1  1.12.8-gke.10  2          RUNNING
=================================================================================================


3)ノードが生成されているの確認を行ってみる。
kubectl get node
=========================================================================
NAME                                                  STATUS   ROLES    AGE   VERSION
gke-persistent-disk-tuto-default-pool-aafc462d-3l7h   Ready    <none>   19s   v1.12.8-gke.10
gke-persistent-disk-tuto-default-pool-aafc462d-pzjp   Ready    <none>   20s   v1.12.8-gke.10
========================================================================

4)早速、mysqlwordpressの永続ディスクのマニュフェストを実施する。
kubectl apply -f mysql-volumeclaim.yaml
kubectl apply -f wordpress-volumeclaim.yaml


5)ディスクが作成できたのか確認を行ってみる。
kubectl get pvc
==========================================================================
NAME                    STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mysql-volumeclaim       Bound    pvc-2433e9f5-9c06-11e9-ae37-42010a920050   200Gi      RWO            standard       37s
wordpress-volumeclaim   Bound    pvc-28e681c6-9c06-11e9-ae37-42010a920050   200Gi      RWO            standard       29s
============================================================================


6)MySQL用のシークレットの作成を行う。
kubectl create secret generic mysql --from-literal=password=********


7)MySQLのマニュフェストを実行する。
kubectl create -f mysql.yaml


8)MySQLのサービスの作成する。
kubectl create -f mysql-service.yaml


9)サービスが作成できたか確認してみる。
kubectl get svc
================================================================
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
kubernetes   ClusterIP   10.0.16.1    <none>        443/TCP    12m
mysql        ClusterIP   10.0.24.72   <none>        3306/TCP   6s
==================================================================



10)Wordpressのマニュフェストの実行する
kubectl create -f wordpress.yaml


11)mysqlwordpresspodが作成できたか確認してみる。
kubectl get pod -o wide
===============================================================================================
NAME                         READY   STATUS    RESTARTS   AGE     IP          NODE                                                  NOMINATED NODE
mysql-5b9b49cf46-vf8qk       1/1     Running   0          4m42s   10.60.0.9   gke-persistent-disk-tuto-default-pool-aafc462d-pzjp   <none>
wordpress-74c847b8cd-s8xgp   1/1     Running   0          62s     10.60.1.5   gke-persistent-disk-tuto-default-pool-aafc462d-3l7h   <none>
===============================================================================================

12)MySQLのサービスのマニュフェストの実施する。
kubectl create -f wordpress-service.yaml


13)サービスの確認をすると、成功しているようだ。
kubectl get svc
==============================================================================
NAME         TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)        AGE
kubernetes   ClusterIP      10.0.16.1     <none>         443/TCP        22m
mysql        ClusterIP      10.0.24.72    <none>         3306/TCP       11m
wordpress    LoadBalancer   10.0.18.170   ************   80:32729/TCP   5m45s
================================================================================

14)早速、接続をしてみる。
http://***********/wp-admin/install.php





15)初期設定方法については割愛。




16)GCP側でも確認してみる。













php log(ECS ログ出力)

# PHPエラーログの設定 ENV PHP_INI_DIR /usr/local/etc/php RUN { \ echo 'log_errors = On' ; \ echo 'error_log = /proc/self/...