搭建Kubernetes系统

Kubernetes建设

这是为了常驻岗位内部学习会而写的文章,但我将对整个公司进行公开。(这是第一次进行整体公开)
如果有任何建议,请在评论中提出。

為了方便複製和黏貼,我故意沒有加上”$”標記。

Kubernetes和Nvidia Docker的建立

已验证环境

OSARCHdocker Ver.ESXiUbuntu 18.04amd64Docker version 19.03.5, build 633a0ea8386.7 Custom ISOUbuntu 18.04ppc64leDocker version 18.06.1-ce, build e68fc7aNone

ppc64le 在 IBM Power System AC922 POWER9 中进行验证。

容器镜像需要与各自的架构相适应。

Docker的安装(docker-ce)

已有的卸载

sudo apt-get remove docker docker-engine docker.io containerd runc

Docker CE的安装

# パッケージの更新
sudo apt-get update
# 必要モジュールのインストール
sudo apt-get install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

# キーの追加
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88

# リポジトリの追加
# amd64
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

# ppc64le
sudo add-apt-repository \
   "deb [arch=ppc64el] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

# パッケージの更新
sudo apt-get update

# dockerのインストール
sudo apt-get install -y docker-ce

# ユーザーの追加
sudo usermod -aG docker $USER

# dockerサービスの自動起動
sudo systemctl enable docker

# dockerサービスの起動
sudo systemctl start docker


補足情報

# インストール可能なリスト
apt-cache madison docker-ce

# バージョンを指定してインストール
sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io

安装 Kubernetes(Master/Worker)

如果没有特别说明,那么Master和Worker都要进行工作。

在存储库中注册密钥。

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"

更新存储库

sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

# バージョン指定
sudo apt install -y kubelet=1.17.2-00 kubeadm=1.17.2-00 kubectl=1.17.2-00

关闭掉互换

## 都度適応?
## /etc/fstabを削除すると泣くことになる -> なぜかdockerが立ち上がらなくなる
sudo swapoff -a

/etc/fstabを以下のようにコメントアウトを行うことで一旦は対応できました。

请在终端中输入以下命令:sudo nano /etc/fstab

- /swap.img      none    swap    sw      0       0
+ #/swap.img      none    swap    sw      0       0

使用kubeadm进行设置(Master)。

sudo kubeadm init --pod-network-cidr=10.244.0.0/16

添加 Kubernetes 配置(主节点)

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

编辑iptables

在中国本土化地改写以下内容,只需提供一种选项:
将 sudo sysctl net.bridge.bridge-nf-call-iptables=1 改写成中文。

如果不这样做,core-dns的pod将无法启动。

在主节点上添加flannel.yaml。

使用kubectl命令应用flannel.yml文件

建立LoadBranser(主控端)。

应用metallb.yaml文件

kubectl 应用 -f metallb.yaml

应用于LAN内分配IP的yaml配置文件。

---
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - xxx.xxx.xxx.xxx-xxx.xxx.xxx.xxx # この部分をLAN内のIPに変更する

如果要在主节点上进行部署(如单主节点结构等)

kubectl taint nodes 名称空间 node-role.kubernetes.io/master:NoSchedule-

可以使用 “kubectl get node” 命令获取名称空间部分(Master 的名称),然后进行设置。

kubectl describe node node名

# ~~ 中略 ~~
Taints:             <none>
# ~~ 中略 ~~
# 上記になっていることを確認

给Master添加一个节点(Worker)。

sudo kubeadm join xxx.xxx.xxx.xxx:6443 --token xxxxxx.xxxxxxxxxxxxx --discovery-token-ca-cert-hash sha256:xxxxxxx

在构建Master时,设置–token和–discovery-token-ca-cert-hash选项会最后显示。

令牌失去后(Master)

# tokenが不明になった場合は再度発行すれば良い
kubeadm token create --print-join-command

确认主节点是否已添加。

kubectl get nodes
NAME           STATUS   ROLES    AGE     VERSION
Master         Ready    master   3m11s   v1.17.1
Node1          Ready    <none>   2m10s   v1.17.1

此处为DashBorad(v2.0.0-rc2)的部署(以下为在Master上的操作)。

如果从Kubernetes存储库直接部署,只能从集群内部访问,因此需要部署recommended.yaml并设置NodePort。但是,即使从存储库直接部署并设置NodePort,也会遇到类似于问题中的错误,因此这里使用已经准备好的dashboard/recommended.yaml。另外,在进行此操作时需要进行证书配置,请执行以下操作。

领取自己的证书

mkdir certs
openssl req -nodes -newkey rsa:2048 -keyout certs/dashboard.key -out certs/dashboard.csr -subj "/C=JP/ST=kubernetes/L=kubernetes/O=kubernetes/OU=kubernetes/CN=kubernetes-dashboard"
openssl x509 -req -sha256 -days 365 -in certs/dashboard.csr -signkey certs/dashboard.key -out certs/dashboard.crt

如果直接部署,删除已经定义的部分。

# 削除
kubectl -n kubernetes-dashboard delete secret kubernetes-dashboard-certs

使证明书能够从pod使用。

    • certs/dashboard.crt

 

    • certs/dashboard.csr

 

    certs/dashboard.key

将上述的证书文件转换为能够设置到 Secret 对象中的形式(不包含换行符,以一行设置)。

# base64形式で設定する必要があるのでbase64コマンドで設定する
# それぞれのファイルで実施する
# certs/dashboard.crt
# certs/dashboard.csr
# certs/dashboard.key
cat certs/dashboard.crt | base64
cat certs/dashboard.csr | base64
cat certs/dashboard.key | base64

建议修改 recommended.yaml

---
apiVersion: v1
data:
  dashboard.crt: base64に変換された.crtファイルを記述
  dashboard.csr: base64に変換された.crsファイルを記述
  dashboard.key: base64に変換された.keyファイルを記述
kind: Secret
metadata:
  name: kubernetes-dashboard-certs
  namespace: kubernetes-dashboard
  labels:
    k8s-app: kubernetes-dashboard
type: Opaque

申请吧!

使用kubectl apply命令应用dashboard/recommended.yaml文件。

请设置登录令牌

在登录界面上,需要输入令牌(token)或kubeconfig文件。
在本次记录中,将说明使用令牌进行登录的方法。

    token を発行するユーザーの apply
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: admin-user
    namespace: kubernetes-dashboard
kubectl apply -f admin-user.yaml
kubectl get secret -n kubernetes-dashboard | grep admin
  admin-user-token-xxxx             kubernetes.io/service-account-token   3
kubectl describe secret -n kubernetes-dashboard admin-user-token-xxxxx

复制所显示的令牌。

选择一个令牌,并将其粘贴为登录凭证,然后进行登录操作。

dashboard

GPU支持(以下,Worker中的工作)

如果要在ESXi上支持Ubuntu,请在以下设置中设置(在关闭状态下)。

设置GPU直通。

主机 > 管理 > 硬件 > 选择相应的GPU,点击切换透传 > 重新启动

添加PCI设备

設定の編集からPCIデバイスの追加
GPU以外にパススルーされてるものも一緒に追加する

将客机操作系统设置为可以识别GPU。

在虚拟机选项的详细设置中,添加以下配置到编辑配置中。

キー値hypervisor.cpuid.v0FALSE

确认显卡

lspci | grep -i nvidia
运行 lspci 命令,筛选包含 NVIDIA 的结果。

如果未正确显示,请更新信息。

请使用sudo命令更新pciids。

CUDA的安装(不需要docker:v19.03)。

从以下网站下载并安装适用于您的GPU的CUDA。

CUDA工具包

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
sudo add-apt-repository "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/ /"
sudo apt-get update
sudo apt-get -y install cuda

在.bashrc中添加路径

export PATH="/usr/local/cuda/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"

进行重新启动

请立即重启系统

安装NVIDIA图形驱动程序

sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update

安装推荐驱动器。

sudo apt -y install ubuntu-drivers-common
sudo ubuntu-drivers autoinstall

安装NVIDIA容器工具包。

为了安装NVIDIA Container Toolkit,需要将apt存储库添加至机器中。

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

安装NVIDIA容器工具包并重新启动Docker。

sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker

进行重新启动

现在重新启动,使用sudo shutdown -r。

安装后的确认
可以确认驱动程序和CUDA的版本

nvidia-container-cli info

NVRM version:   440.48.02
CUDA version:   10.2

Device Index:   0
Device Minor:   0
Model:          GeForce RTX 2070
Brand:          GeForce
GPU UUID:       GPU-2318f1ba-cc45-3c5b-a000-798ad9ba8390
Bus Location:   00000000:0b:00.0
Architecture:   7.5

确认 Docker 是否可用。

docker run --rm --gpus all -it ubuntu nvidia-smi

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.48.02    Driver Version: 440.48.02    CUDA Version: N/A      |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce RTX 2070    Off  | 00000000:0B:00.0 Off |                  N/A |
| 29%   33C    P8    21W / 175W |      0MiB /  7982MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

让Kubernetes识别GPU

请在docker:v19.03版本中安装nvidia-container-runtime。

请通过 sudo apt-get install nvidia-container-runtime 命令安装NVIDIA容器运行时。

kubernetesから使用出来るようにDockerのデフォルトランタイムをGPUに変更

{
    "default-runtime": "nvidia",
    "runtimes": {
        "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}

gpu-pluginを適用(Master)

kubectl应用 -f https://raw.githubusercontent.com/ncs-nozomi-nishinohara/kubernetes-Construction/master/nvidia-device-plugin.yml

广告
将在 10 秒后关闭
bannerAds