Swapを使っているプロセスを特定する
Swapを使っているプロセスを特定する方法をメモしておく。
使用しているOSは、Ubuntu18.04。
結論からいうと、以下でOK。
# grep VmSwap /proc/*/status | sort -n -k 2 -r
オペレーションの流れ
swapが使われていることを確認する。
# free -h total used free shared buff/cache available Mem: 7.8G 1.0G 1.9G 1.5M 4.9G 6.5G Swap: 1.5G 748M 772M
swapを使っているプロセスを特定する。
# grep VmSwap /proc/*/status | sort -n -k 2 -r | head -5 /proc/18845/status:VmSwap: 747488 kB /proc/20946/status:VmSwap: 8156 kB /proc/19001/status:VmSwap: 2340 kB /proc/20985/status:VmSwap: 1232 kB /proc/20983/status:VmSwap: 1232 kB
原因は、netdataだった。
# ps -p 18845 uwww USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND netdata 18845 0.7 6.8 1490180 562492 ? Ssl Feb20 1162:59 /usr/sbin/netdata -P /var/run/netdata/netdata.pid -D -W set global process scheduling policy keep -W set global OOM score keep
Jenkinsを2系から、1系に応急的に切り戻す
バージョンが1.6系の古のJenkinsを運用していたが、誤ってapt upgradeしてしまいバージョンが 2.1系にあがり、起動しなくなってしまった。
OSは、Ubuntu 14.04。
# apt upgradeの抜粋 Unpacking jenkins (2.179) over (1.6xx)
切り戻しをしたので、メモしておく。
ただし、応急療法なので、動作性の責任は取れない。。
結論からいうと、以下の二つの対応で、切り戻しができた。
- jenkins.warの差し替え
- /etc/init.d/jenkinsの修正
jenkins.warの差し替え
/usr/share/jenkins配下に、2系のjenkins.warがあるので、それを元々運用していたバージョンに差し替える。
# cd /usr/share/jenkins # mv jenkins.war jenkins.war.20190527a # wget https://updates.jenkins-ci.org/download/war/1.6xx/jenkins.war
/etc/init.d/jenkinsの修正
修正しないと、以下のように起動スクリプトのJavaのバージョン判定に引っかかり、起動できない。
# service jenkins status Found an incorrect Java version Java version found: java version "1.7.0_201" OpenJDK Runtime Environment (IcedTea 2.6.17) (7u211-2.6.17-0ubuntu0.1) OpenJDK 64-Bit Server VM (build 24.201-b00, mixed mode) Aborting
なので、バージョンを判定する箇所をコメントアウトする。
# diff -u /etc/init.d/jenkins.20190527a /etc/init.d/jenkins --- /etc/init.d/jenkins.20190527a 2019-05-27 18:20:38.400852420 +0900 +++ /etc/init.d/jenkins 2019-05-27 18:16:02.159208259 +0900 @@ -59,15 +59,15 @@ # Work out the JAVA version we are working with: JAVA_VERSION=$($JAVA -version 2>&1 | sed -n ';s/.* version "\(.*\)\.\(.*\)\..*".*/\1\2/p;') -if [[ ${JAVA_ALLOWED_VERSIONS[*]} =~ "$JAVA_VERSION" ]]; then - echo "Correct java version found" >&2 -else - echo "Found an incorrect Java version" >&2 - echo "Java version found:" >&2 - echo $($JAVA -version) >&2 - echo "Aborting" >&2 - exit 1 -fi +#if [[ ${JAVA_ALLOWED_VERSIONS[*]} =~ "$JAVA_VERSION" ]]; then +# echo "Correct java version found" >&2 +#else +# echo "Found an incorrect Java version" >&2 +# echo "Java version found:" >&2 +# echo $($JAVA -version) >&2 +# echo "Aborting" >&2 +# exit 1 +#fi # load environments if [ -r /etc/default/locale ]; then
正常に起動することを確認する。
# service jenkins start * Starting Jenkins Automation Server jenkins ...done. # service jenkins status Jenkins Automation Server is running with the pid 26347
AWS 認定ソリューションアーキテクトを受けてきた
結論
先月の終わりに、AWS 認定ソリューションアーキテクト - アソシエイトを受けて、合格した。
スペック
- プライベートで、EC2やS3をチュートリアルで触ったことがある程度の知識。
- パブリッククラウドの業務経験はなし。
- オンプレミスのサーバ運用業務経験はあり。
- 応用情報技術者は、取得済み。ネットワークについて、最低限の知識はある(と思う)
勉強期間
2週間。
勉強方法
をやりながら、AWSコンソールの操作、基本的なサービスを覚えた。
ブラックベルトを一通り読んだ。
有料プランを申し込んで、全ての問題を解いた。
これも2周くらい読み込んだ。
終わってみて
AWSに関する基本知識が身につき、ケーススタディに書いてある各社のシステム構成図が読めるようになった。
自分も設計できる機会があればいいな。
次は、AWS 認定ソリューションアーキテクト - プロフェッショナルを目指したい。
Container Linuxにkubeadmを入れて、k8sクラスタを構築する
はじめに、Container Linuxを3台用意しておく。
- k8s01(192.168.0.2/24)
- k8s02(192.168.0.3/24)
- k8s03(192.168.0.4/24)
バージョンは、こちら。
$ grep VERSION= /etc/os-release VERSION=2023.5.0
Container Linuxの初期設定
各ホストで、パスワード、ホスト、固定IPアドレスの設定を済ませる。
パスワードの設定
$ sudo passwd core
ホストの名前設定
$ sudo hostnamectl set-hostname k8s01 $ sudo vi /etc/hosts $ grep k8s01 /etc/hosts 127.0.0.1 localhost k8s01
固定IPアドレスの設定
### k8s01の設定 $ sudo vi /etc/systemd/network/static.network $ sudo cat /etc/systemd/network/static.network [Match] Name=eth0 [Network] Address=192.168.0.2/24 Gateway=192.168.0.1 DNS=8.8.8.8 ### ネットワークの再起動 $ sudo systemctl restart systemd-networkd
kubeadmのインストール
にあるContainer Linuxのインストール手順をrootで実行する。
$ cat install.sh ### CNIをインストール CNI_VERSION="v0.6.0" mkdir -p /opt/cni/bin curl -L "https://github.com/containernetworking/plugins/releases/download/${CNI_VERSION}/cni-plugins-amd64-${CNI_VERSION}.tgz" | tar -C /opt/cni/bin -xz ### CRICTLをインストール CRICTL_VERSION="v1.11.1" mkdir -p /opt/bin curl -L "https://github.com/kubernetes-incubator/cri-tools/releases/download/${CRICTL_VERSION}/crictl-${CRICTL_VERSION}-linux-amd64.tar.gz" | tar -C /opt/bin -xz ### kubeadm, kubelet, kubectlをインストール RELEASE="$(curl -sSL https://dl.k8s.io/release/stable.txt)" mkdir -p /opt/bin cd /opt/bin curl -L --remote-name-all https://storage.googleapis.com/kubernetes-release/release/${RELEASE}/bin/linux/amd64/{kubeadm,kubelet,kubectl} chmod +x {kubeadm,kubelet,kubectl} curl -sSL "https://raw.githubusercontent.com/kubernetes/kubernetes/${RELEASE}/build/debs/kubelet.service" | sed "s:/usr/bin:/opt/bin:g" > /etc/systemd/system/kubelet.service mkdir -p /etc/systemd/system/kubelet.service.d curl -sSL "https://raw.githubusercontent.com/kubernetes/kubernetes/${RELEASE}/build/debs/10-kubeadm.conf" | sed "s:/usr/bin:/opt/bin:g" > /etc/systemd/system/kubelet.service.d/10-kubeadm.conf ### kubeletを有効にする。 systemctl enable kubelet && systemctl start kubelet $ sudo sh install.sh
k8sクラスタ構築
マスターノード構築
### k8s01側 ### クラスタの初期化 $ sudo kubeadm init --pod-network-cidr=10.244.0.0/16 ### ブリッジのパケットをiptablesで処理できるようにする設定 $ sudo sysctl net.bridge.bridge-nf-call-iptables=1 $ mkdir -p $HOME/.kube $ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config $ sudo chown $(id -u):$(id -g) $HOME/.kube/config ### masterとして稼働していることを確認 $ kubectl cluster-info Kubernetes master is running at https://10.200.8.117:6443 KubeDNS is running at https://10.200.8.117:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'. ### クラスタに参加するためのkubeadm join コマンドが発行されるので、控えておく。
ノード追加
### k8s02とk8s03側 $ sudo kubeadm join 192.168.0.2:6443 --token pu2npf.e42wltclx0f64bdc --discovery-token-ca-cert-hash sha256:9eb6af07398ebf79ef0acb0b70e18fca5f26c00912c2e132bbe634568316c347
クラスタ確認
### k8s01側 $ kubectl get nodes NAME STATUS ROLES AGE VERSION k8s01 NotReady master 1m v1.13.4 k8s02 NotReady <none> 3s v1.13.4 k8s03 NotReady <none> 3s v1.13.4
Flannel設定
クラスタが構築できたが、STATUSがNotReadyになっている。
ノードをまたいで、Pod同士が通信できるように、Flannelで、オーバレイネットワークを設定する。
### k8s01側 $ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml $ kubectl get nodes NAME STATUS ROLES AGE VERSION k8s01 Ready master 5m28s v1.13.4 k8s02 Ready <none> 3m49s v1.13.4 k8s03 Ready <none> 2m23s v1.13.4
以上で、kubeadmを用いてk8sクラスタを構築することができた。
参考
https://coreos.com/flannel/docs/latest/kubernetes.html
psqlで、冗長な箇所を省き結果を取得する
例えば、PostgreSQLのpg_hba.confのパスだけをpsqlで取りたいとき、
単純に、-cオプションを使うと、
$ psql -c 'SHOW hba_file' hba_file ------------------------------------- /etc/postgresql/10/main/pg_hba.conf (1 row)
余分な箇所が混ざる。
その場合、-A -tオプションを追加すると冗長な部分を排除し期待していた結果が取得できる。
$ psql -At -c 'SHOW hba_file' /etc/postgresql/10/main/pg_hba.conf
今までは、こんな形でシェル芸してた。
$ psql -c 'SHOW hba_file' | grep /etc | sed -e 's/ //' /etc/postgresql/10/main/pg_hba.conf