skydum

個人的な作業記録とか備忘録代わりのメモ

これにはインターネットが必要です。(0x800704cf)

Microsoft Storeへの接続エラー

サーバーでMicrosoft Storeへ接続しようとしたら以下のエラーが発生して接続できない問題が発生した。

これにはインターネットが必要です。(0x800704cf)

解決したコマンド

コマンドプロンプトを管理者権限で開いて以下のコマンドを実行。

netsh winhttp reset proxy

WindowsはEdge, Chromeなどが使うPROXYとは別にWindows Update等システムの通信に使われるPROXYが別に存在している。
winhttp proxyはGUIからは確認、設定ができないのでnetshで設定を初期化したらつながるようになった。

以前はサーバーでsquidを動かしていたのでproxyを通していたが、現在はsquidを止めてしまったので動かなくなっていたようだ。

winhttp proxyの確認方法

コマンドプロンプトを管理者権限で開いて以下のコマンドを実行。

netsh winhttp dump

設定されている場合

設定されてない場合

最近の流行を取り入れたDevcontainer+Python+rey+uv環境構築

Devcontainerでpythonの実行環境を作る

Devcontainerは便利そうだなと思いつつも手を出していなかったが、pythonのバージョンを色々切り替えて動かさないといけないものがあって不便だったのでDevcontainerに入門した。

構築した環境

python3 + rye + uvの最近流行りの構成。

Devcontainer始め方

Devcontaienrに必要なファイルをVSCodeに作ってもらう

  1. VSCode拡張機能のRemote Developmentをインストール
  2. 開発を行うプロジェクトのフォルダを開く
  3. ctrl+shift+pでコマンドパレットを開いて、以下の順番に選択
  4. 実行用のpythonのバージョンはryeで切り替えられるので最新版を選択しておけば良い
  5. 必要なものはDockerfileやpostCreateCommandでも入れられるので後で追加しても良い
  6. 暫くすると以下の様にファイルができる

設定をカスタマイズする

以下の状態になるようにファイルを編集、追加します

devcontainer.json

ms-python.pythonの所に事前にインストールしたい拡張機能を記載すればDevcontainer起動時に拡張機能がインストールされた状態で起動します。
手作業で追加するのは大変なので簡単に追加する方法を後で記載します。

// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/python
{
    "name": "Python 3",
    "build": {
        "dockerfile": "Dockerfile"
    },
    "customizations": {
        "vscode": {
            "extensions": [
                "ms-python.python",
         ]
        }
    },
    "remoteUser": "vscode",
    "postCreateCommand": "/bin/bash .devcontainer/postCreateCommand.sh"
}

Dockerfile

FROM mcr.microsoft.com/devcontainers/python:1-3.12-bullseye

RUN apt-get update \
    && apt-get install -y git vim curl bash-completion \
    && apt-get clean && rm -rf /var/lib/apt/lists/*

postCreateCommand.sh

ryeとuvを使いたいのでインストールする

#!/bin/bash
curl -sSf https://rye-up.com/get | RYE_INSTALL_OPTION="--yes" bash
echo 'source "$HOME/.rye/env"' >> ~/.bashrc
. "$HOME/.rye/env"

rye config --set-bool behavior.use-uv=true
mkdir -p ~/.local/share/bash-completion/completions
rye self completion > ~/.local/share/bash-completion/completions/rye.bash

Devcontainerを起動する方法

いくつか方法があります。
いちばん簡単なのは現在開いているプロジェクトのフォルダを再度開き直すと、メッセージが出るのでコンテナで再度開くを選択する。


もう一個がコマンドパレット(crtl+shift+p)を開いて、開発コンテナ:コンテナーでリビルドして再度開くを選択

を選んでしばらく待つとDevcontainerで環境が構築されます。

devcontainer.json拡張機能を追加する

  1. Devcontainerが起動したら拡張機能の一覧(ctrl+shift+x)を開く
  2. Devcontainerに追加したい拡張を選択して右クリックからdevcontainer.jsonに追加を選択すると良い

VSCodeのRemote Developmentで接続できなくなった

VSCodeのRemote Developmentで接続できなくなった

開発したコードの動作検証にUbuntu18.04を使っているハードウェアを使ってる。
時々上記のハードにVSCodeのRemote Developmentを使って接続していたが気付いたら接続できなくなっていたので、調査した。

同様の問題がAmazon Linux2でもVSCode1.86以上に上げるとRemote Developmentで接続できない問題が発生している。
解決策を先に書いておくとVSCode1.85.2にダウングレードすると解決する。

VSCode1.85.2のZIP形式のダウンロードリンク
https://update.code.visualstudio.com/1.85.2/win32-x64-archive/stable

他の形式はこっち
https://code.visualstudio.com/updates/v1_85
VSCodeのinsider preview版を入れても解決できるので、何らかの対応はされそう?

表示されるエラー

以下のエラーが怪しい。

Exec server process not found
[2024-02-08 12:56:20] error This machine does not meet Visual Studio Code Server's prerequisites, expected either...:   - find GLIBC >= v2.28.0 (but found v2.27.0 instead) for GNU environments
  - find /lib/ld-musl-aarch64.so.1, which is required to run the Visual Studio Code Server in musl environments

再度接続

もう一度接続するとVSCodeで以下のエラーが表示されるので、詳細をクリック。

Remote Development with Linux

Remote Developmentの利用要件がたくさん書かれている。
VSCode18.6からRemote Developmentの必要要件が変更されたらしい。
https://code.visualstudio.com/docs/remote/linux#_remote-host-container-wsl-linux-prerequisites

GitHub issue: Workaround for machines that do not have glibc >= 2.28 #203375

もう少し調べてみたらGitHubでissueを見つけた。
https://github.com/microsoft/vscode/issues/203375

問題を回避する

一旦VSCode 18.5にすれば解決するらしいので、ダウングレードする。

旧バージョンのダウンロード

以下のページの赤線の所をクリックすると旧バージョンのインストーラーがダウンロードできる。
https://code.visualstudio.com/updates/v1_85

他の形式のファイルをダウンロードしたい時

以下のURLにいくと他の形式でダウンロードする方法が記載されているので、自身で欲しいバージョン情報を埋めると良い。
以下の画像にはWindowsしか表示されていないがLinuxなども表の下の方に存在する。
https://code.visualstudio.com/docs/supporting/faq#_previous-release-versions

VSCode1.85.2のZIP形式のリンクは以下の様になる。
https://update.code.visualstudio.com/1.85.2/win32-x64-archive/stable

6bc53a02b7a8: running
Found existing installation at /home/ubuntu/.vscode-server...
Starting VS Code CLI... "/home/ubuntu/.vscode-server/code-05047486b6df5eb8d44b2ecd70ea3bdf775fd937" command-shell --cli-data-dir "/home/ubuntu/.vscode-server/cli" --on-port --parent-process-id 9733 &> "/home/ubuntu/.vscode-server/.cli.05047486b6df5eb8d44b2ecd70ea3bdf775fd937.log" < /dev/null
printenv:
    SSH_CONNECTION=115.163.87.133 51661 172.31.22.20 22
    LANG=C.UTF-8
    XDG_SESSION_ID=8
    USER=ubuntu
    PWD=/home/ubuntu
    HOME=/home/ubuntu
    SSH_CLIENT=115.163.87.133 51661 22
    MAIL=/var/mail/ubuntu
    SHELL=/bin/bash
    SHLVL=2
    VSCODE_AGENT_FOLDER=/home/ubuntu/.vscode-server
    LOGNAME=ubuntu
    DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
    XDG_RUNTIME_DIR=/run/user/1000
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
    _=/usr/bin/printenv
Removing old logfile at /home/ubuntu/.vscode-server/.cli.05047486b6df5eb8d44b2ecd70ea3bdf775fd937.log
Spawned remote CLI: 9753
Waiting for server log...
Waiting for server log...
Exec server process not found
[2024-02-08 12:56:20] error This machine does not meet Visual Studio Code Server's prerequisites, expected either...:   - find GLIBC >= v2.28.0 (but found v2.27.0 instead) for GNU environments
  - find /lib/ld-musl-aarch64.so.1, which is required to run the Visual Studio Code Server in musl environments
6bc53a02b7a8: start
SSH_AUTH_SOCK====
DISPLAY====
listeningOn====
osReleaseId==ubuntu==
arch==aarch64==
vscodeArch==arm64==
bitness==64==
tmpDir==/run/user/1000==
platform==linux==
unpackResult====
didLocalDownload==0==
downloadTime====
installTime====
serverStartTime==91==
execServerToken==0d226e97-da0f-45f9-b389-6c88a83e261e==
6bc53a02b7a8: end

MinikubeとMetalLBを使ってKubernetesのロードバランサー機能を試す

MetalLBをKubernetesで使ってみる

環境

  • Ubuntu 22.04.3 LTS
  • minikube version: v1.32.0

MetalLB

Kubernetesロードバランサーの機能を提供していないので、ローカルでServiceのtype: LoadBalancerとしてもEXTERNAL-IPが割当らずPending状態となってしまう。 MetalLBはローカルでローロバランサー機能を提供しtype: LoadBalancerとした場合に問題なくKubernetesにネットワークロードバランサーの機能を追加するためのソフトウェア。

minikubeでMetalLBを利用する

MetalLBを有効にする

$ minikube addons enable metallb
! metallb is a 3rd party addon and is not maintained or verified by minikube maintainers, enable at your own risk.
! metallb does not currently have an associated maintainer.
  - Using image quay.io/metallb/speaker:v0.9.6
  - Using image quay.io/metallb/controller:v0.9.6
* The 'metallb' addon is enabled
$ minikube addons list
|-----------------------------|----------|--------------|--------------------------------|
|         ADDON NAME          | PROFILE  |    STATUS    |           MAINTAINER           |
|-----------------------------|----------|--------------|--------------------------------|
| ambassador                  | minikube | disabled     | 3rd party (Ambassador)         |
| auto-pause                  | minikube | disabled     | minikube                       |
| cloud-spanner               | minikube | disabled     | Google                         |
| csi-hostpath-driver         | minikube | disabled     | Kubernetes                     |
| dashboard                   | minikube | disabled     | Kubernetes                     |
| default-storageclass        | minikube | enabled ?   | Kubernetes                     |
| efk                         | minikube | disabled     | 3rd party (Elastic)            |
| freshpod                    | minikube | disabled     | Google                         |
| gcp-auth                    | minikube | disabled     | Google                         |
| gvisor                      | minikube | disabled     | minikube                       |
| headlamp                    | minikube | disabled     | 3rd party (kinvolk.io)         |
| helm-tiller                 | minikube | disabled     | 3rd party (Helm)               |
| inaccel                     | minikube | disabled     | 3rd party (InAccel             |
|                             |          |              | [info@inaccel.com])            |
| ingress                     | minikube | disabled     | Kubernetes                     |
| ingress-dns                 | minikube | disabled     | minikube                       |
| inspektor-gadget            | minikube | disabled     | 3rd party                      |
|                             |          |              | (inspektor-gadget.io)          |
| istio                       | minikube | disabled     | 3rd party (Istio)              |
| istio-provisioner           | minikube | disabled     | 3rd party (Istio)              |
| kong                        | minikube | disabled     | 3rd party (Kong HQ)            |
| kubeflow                    | minikube | disabled     | 3rd party                      |
| kubevirt                    | minikube | disabled     | 3rd party (KubeVirt)           |
| logviewer                   | minikube | disabled     | 3rd party (unknown)            |
| metallb                     | minikube | enabled ?   | 3rd party (MetalLB)            |
| metrics-server              | minikube | disabled     | Kubernetes                     |
| nvidia-device-plugin        | minikube | disabled     | 3rd party (NVIDIA)             |
| nvidia-driver-installer     | minikube | disabled     | 3rd party (Nvidia)             |
| nvidia-gpu-device-plugin    | minikube | disabled     | 3rd party (Nvidia)             |
| olm                         | minikube | disabled     | 3rd party (Operator Framework) |
| pod-security-policy         | minikube | disabled     | 3rd party (unknown)            |
| portainer                   | minikube | disabled     | 3rd party (Portainer.io)       |
| registry                    | minikube | disabled     | minikube                       |
| registry-aliases            | minikube | disabled     | 3rd party (unknown)            |
| registry-creds              | minikube | disabled     | 3rd party (UPMC Enterprises)   |
| storage-provisioner         | minikube | enabled ?   | minikube                       |
| storage-provisioner-gluster | minikube | disabled     | 3rd party (Gluster)            |
| storage-provisioner-rancher | minikube | disabled     | 3rd party (Rancher)            |
| volumesnapshots             | minikube | disabled     | Kubernetes                     |
|-----------------------------|----------|--------------|--------------------------------|

minikubeを起動

$ minikube start --cpus 4 --memory 4096
* minikube v1.32.0 on Ubuntu 22.04 (hyperv/amd64)
* Using the docker driver based on existing profile
* Starting control plane node minikube in cluster minikube
* Pulling base image ...
* Restarting existing docker container for "minikube" ...
* Preparing Kubernetes v1.28.3 on Docker 24.0.7 ...
* Configuring bridge CNI (Container Networking Interface) ...
* Verifying Kubernetes components...
  - Using image gcr.io/k8s-minikube/storage-provisioner:v5
  - Using image quay.io/metallb/speaker:v0.9.6
  - Using image quay.io/metallb/controller:v0.9.6
* Enabled addons: storage-provisioner, metallb, default-storageclass
* Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

Kubernetesで環境を構築

Serviceの所でEXTERNAL-IPがついていることを確認。 EXTERNAL-IPがついているのでMetalLBが動作していることがわかる。

$ kubectl apply -f deployment-nginx.yaml
deployment.apps/nginx created

$ kubectl apply -f service-nginx.yaml
service/nginx created
configmap/config unchanged

$ kubectl get all
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-56cfb68995-7z4rr   1/1     Running   0          41s
pod/nginx-56cfb68995-knk7v   1/1     Running   0          41s
pod/nginx-56cfb68995-mw4gs   1/1     Running   0          41s

NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE
service/kubernetes   ClusterIP      10.96.0.1       <none>          443/TCP        3h16m
service/nginx        LoadBalancer   10.98.136.238   192.168.1.240   80:31742/TCP   37s

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx   3/3     3            3           42s

NAME                               DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-56cfb68995   3         3         3       42s

EXTERNAL-IPでアクセス

ホストに到達できないと表示される

# ホストからkubernetesのEXTERNAL-IPへアクセス
$ curl http://192.168.1.240
curl: (7) Failed to connect to 192.168.1.240 port 80 after 3058 ms: No route to host

アクセスできない原因はEXTERNAL-IP経由でアクセスするにはminikube経由でなければいけないから。

ホスト → minikube → EXTERNAL-IP経由でなければアクセスできない

minikube経由でhttp://192.168.1.240へアクセスできるか確認。 問題がなくアクセスできる

# minikubeにsshでログインしてcurlを実行
$ minikube ssh -- curl http://192.168.1.240
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

ポートフォワードして接続

minikubeにsshで接続するには2つの方法がある。 1個目はminikubeの機能でsshを使ってminikubeにログイン。 2個目は通常のsshでのログイン。(今回はこっちを使う)

minikube ssh

$ minikube ssh
docker@minikube:~$

sshを使ってminikubeへログイン

下記のYAMLのserverの所に書かれているIPでsshでアクセスする。
古い情報だとid: docker, pass: tcuserを使ってsshでログインできるとあるが、現在はパスワードでのsshログインは禁止されている。
このため、ログインするにはid_rsaを利用する。

$ kubectl config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority: /home/admin/.minikube/ca.crt
    extensions:
    - extension:
        last-update: Sun, 04 Feb 2024 21:28:22 JST
        provider: minikube.sigs.k8s.io
        version: v1.32.0
      name: cluster_info
    server: https://192.168.49.2:8443  ← これがminikuberにログインするためのIP
  name: minikube
contexts:
- context:
    cluster: minikube
    extensions:
    - extension:
        last-update: Sun, 04 Feb 2024 21:28:22 JST
        provider: minikube.sigs.k8s.io
        version: v1.32.0
      name: context_info
    namespace: default
    user: minikube
  name: minikube
current-context: minikube
kind: Config
preferences: {}
users:
- name: minikube
  user:
    client-certificate: /home/admin/.minikube/profiles/minikube/client.crt
    client-key: /home/admin/.minikube/profiles/minikube/client.key

# 鍵の場所を確認
$ minikube ssh-key
/home/admin/.minikube/machines/minikube/id_rsa

# ログイン
$ ssh docker@192.168.49.2 -i /home/admin/.minikube/machines/minikube/id_rsa

docker@minikube:~$ exit
logout
Connection to 192.168.49.2 closed.

# ホストの8080ポートをminikuberの192.168.1.240:80ポートへポートフォワードする
$ ssh -N docker@192.168.49.2 -i /home/admin/.minikube/machines/minikube/id_rsa -L 8080:192.168.1.240:80

# 別にもう一個ターミナルを開いて
# ホストの8080にcurlでアクセスしてレスポンスが返ってくることを確認
$ curl http://127.0.0.1:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
$

参考ファイル

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1
          ports:
            - name: http
              containerPort: 80

service.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer

---
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: my-ip-space
      protocol: layer2
      addresses:
      - 192.168.1.240/28

参考にしたサイト

Kubernetesで使うコマンド

Kubernetesに入門

よく使うコマンドを忘れないようにメモ

とほほのKubernetes入門
https://www.tohoho-web.com/ex/kubernetes.html

を見たほうが確実だと思う。

Kubernetesの準備

minikubeの起動

minikube start --cpus 4 --memory=4096

クラスタの作成、更新、削除

podの作成

kubectl create -f ファイル名.yaml

podの新規作成と存在する場合は更新

kubectl apply -f ファイル名.yaml

podの設定を置換

kubectl replace --force -f ファイル名.yaml

replicaset, podの削除

kubectl delete -f ファイル名.yaml
kubectl delete rs replicaset名
kubectl delete pod pod名

replicasetの数を変更

kubectl scale --replicas=数値 -f ファイル名.yaml

状態の確認

deploymentの確認

kubectl get deployment

replicasetの確認

kubectl get rs

podの確認

kubectl get pod

podの状況をリアルタイムで確認

kubectl get po -w
kubectl get po --watch

containerのログを表示

実行時のログを確認

単一コンテナ

kubectl logs pod名

複数コンテナ

kubectl logs pod名 -c コンテナ名

apiVersion: v1
kind: Pod
metadata:
  name: initcontainer-test
spec:
  initContainers:
  - name: step1  ← コンテナ名
    image: alpine
    command: ["sh", "-c"]
    args:
    - |
      echo Start at `date`; sleep 5; echo End.

リアルタイム

単一コンテナ

kubectl logs -f pod名

複数コンテナ

kubectl logs -f pod名 -c コンテナ名

podの詳細確認

kubectl describe pod pod名

apiVersion: v1
kind: Pod
metadata:
  name: date-tail  ← pod名
spec:

podの置換

kubectl replace --force -f ファイル名.yaml

podの削除

kubectl delete -f ファイル名.yaml

podの中でコマンドを実行

kubectl exec -it pod名 -- 実行したいコマンド

勉強方法

勉強時間

毎週決めた時間は勉強をすると決めているので何らかの勉強を行っているのだけれども
勉強をする時にどれくらいの時間勉強したのかわからなくなるのでStudyplusで記録を取っている。

app.studyplus.jp

後から見返した時に今週は何時間ぐらい勉強したなとかわかるのが便利かなと思いながら記録をつけている。
それと、やっる気が出ない時にフォローしている人が頑張っているのを見ると頑張ろうかなと思うのも理由。
記録をしないとサボってしまうので自分にはあっている気がする。

集中できない

勉強するときはポモドーロテクニックが良いと聞いたので1ヶ月ぐらい続けている。
何時間か休憩せずに勉強してからまとめて休憩をすると、少しずつ疲れてあんまり集中できていない気がするが、
25分*4,5回の方があまり疲れないので長時間勉強するときには良い方法かなと思った。

長時間勉強をしても集中できていないと意味がないので、今後も模索していきたい。