k8sクラスターのデプロイメント

【1】dockerのインストール

systemctl enable docker

すべてのノードに docker をインストールして自動的に起動するようにする必要があり、各ノードにミラー アクセラレータがデプロイされます。

[2] k8sのyumファイルの設定

[root@k8s1 ~]# cd /etc/yum.repos.d/
[root@k8s1 yum.repos.d]# vim k8s.repo
[root@k8s1 yum.repos.d]# cat k8s.repo 
[k8s]
name=k8s
enabled=1
gpgcheck=0
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
[k8s@k8s1 ~]$ yum repolist
Loaded plugins: langpacks, product-id, search-disabled-repos, subscription-manager
k8s                                                                                                                                 561/561
repo id                                                           repo name                                                           status
HighAvailability                                                  HighAvailability                                                       51
ResilientStorage                                                  ResilientStorage                                                       56
docker-ce-stable/x86_64                                           Docker CE Stable - x86_64                                              79
dvd                                                               rhel7.6                                                             5,152
k8s                                                               k8s                                                                   561
repolist: 5,899

【3】kubelet、kubeadm、kubectlのインストール(全ノードで実行)

kubelet はクラスターのすべてのノードで実行され、ポッドとコンテナーの起動を担当します。

kubeadm はクラスターの初期化に使用されます。

kubectl は、Kubernetes コマンドライン ツールです。kubectl を介して、アプリケーションをデプロイおよび管理したり、さまざまなリソースを表示したり、さまざまなコンポーネントを作成、削除、更新したりできます。

 yum install kubelet kubeadm kubectl -y

[4] kubeletの起動

現時点では、設定がまだ利用できないため、kubelet を起動できません。現在は、起動時に自動的に起動するように設定することしかできません。

各ホストは以下を実行します。

systemctl enable --now  kubelet

kubeadm を使用してクラスターを作成する

【1】環境準備(各ノードは以下の操作を行う必要がありますマスター、ノード)

1. CPU の数は少なくとも 2 つである必要があります。そうでない場合はエラーが報告されます。

2. 解決を行うには、ホストごとにホスト名を解決する必要があります

3. iptablesによって実現される組み込みブリッジ機能を必ず開いてください。

 cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

4. 各ノードでスワップを有効にすることを禁止する必要がある スワップが有効になっている場合、kubelet は起動できません

[root@server1 ~]# swapoff -a && sysctl -w vm.swappiness=0
vm.swappiness = 0
[root@server1 ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:            769         305         104           5         359         312
Swap:             0           0           0

次に、/etc/fstab ファイルを変更し、スワップ行をコメントアウトして、永続的なシャットダウンを実現します。

5. ファイアウォールと selinux をオフにする

6. docker の cgroup ドライバーを systemd に変更します。

[k8s@k8s1 ~]$ sudo  cat /etc/docker/daemon.json
{
    
    
  "registry-mirrors": ["https://ioeo57w5.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    
    
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}

その後、docker を再起動します。

systemctl daemon-reload
systemctl restart docker

各ノードを設定する必要があります。

[root@server1 docker]# scp daemon.json server2:/etc/docker/
daemon.json                                   100%  287   328.6KB/s   00:00    
[root@server1 docker]# scp daemon.json server3:/etc/docker/
daemon.json                                   100%  287   300.0KB/s   00:00

【2】マスターの初期化

初期化中に、より高いバージョンを選択できます (例: 1.19.1)。

# kubeadm config print init-defaults	//查看默认配置信息
 
默认从k8s.gcr.io上下载组件镜像,需要翻墙才可以,所以需要修改镜像仓库:
 
# kubeadm config images list --image-repository registry.aliyuncs.com/google_containers	//列出所需镜像
 
# kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers	//拉取镜像
 
# kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository registry.aliyuncs.com/google_containers		//初始化集群
 
--pod-network-cidr=10.244.0.0/16	//使用flannel网络组件时必须添加
--kubernetes-version 	//指定k8s安装版本

フィールドの意味:

  • image-repository string: これは、イメージをプルする場所を指定するために使用されます (バージョン 1.13 でのみ利用可能)。デフォルト値は k8s.gcr.io です。国内のイメージ アドレスとして指定します: registry.aliyuncs.com /google_containers、最初にイメージをダウンロードしてプライベート ウェアハウスに配置し、プライベート ウェアハウスから直接プルすることもできます。
  • kubernetes-version 文字列: kubenets のバージョン番号を指定します。デフォルト値はsteady-1です。これにより、https://dl.k8s.io/release/stable-1.txtから最新のバージョン番号がダウンロードされます。指定できます。ネットワークリクエストをスキップするための修正版(最新バージョン:v1.18.1)です。

  • apiserver-advertise-address は、クラスターの他のノードとの通信にマスターのどのインターフェイスが使用されるかを示します。マスターに複数のインターフェイスがある場合は、それらを明示的に指定することをお勧めします。指定しない場合、kubeadm はデフォルト ゲートウェイを持つインターフェイスを自動的に選択します。
  • pod-network-cidr は、ポッド ネットワークのスコープを指定します。Kubernetes はさまざまなネットワーク ソリューションをサポートしており、さまざまなネットワーク ソリューションには --pod-network-cidr に対する独自の要件があります。ここでは、フランネル ネットワーク ソリューションを使用するため、10.244.0.0/16 に設定されています。このCIDR。

次の出力が表示された場合は、クラスターが正常に作成されたことを意味します。

......
 
Your Kubernetes control-plane has initialized successfully!
 
To start using your cluster, you need to run the following as a regular user:
 
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config
 
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/
 
Then you can join any number of worker nodes by running the following on each as root:
 
kubeadm join 192.168.1.80:6443 --token ppjbls.alwij8qpsc6nz77j \
    --discovery-token-ca-cert-hash sha256:965e83493774c34e51b6213e43f3cb107fd1b51baad4e5db00f52b298068d259

成功後の最後のコマンドに注目してください。この join コマンドはノードの追加に使用できます。

初期化が失敗した場合は、次のコードを使用してクリアして再初期化してください。

# kubeadm reset

【3】kubectlの設定

kubectl は、Kubernetes クラスターを管理するためのコマンドライン ツールです。以前にすべてのノードに kubectl をインストールしました。マスターが初期化された後、いくつかの構成作業を行う必要があります。その後、kubectl を使用できるようになります。

[root@server1 ~]# mkdir -p $HOME/.kube
[root@server1 ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@server1 ~]# chown $(id -u):$(id -g) $HOME/.kube/config

使いやすくするために、kubectl コマンドのオートコンプリート機能を有効にします。

 [root@server1 ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc

これでkubectlを使用する準備が整いました

[root@server1 ~]#  kubectl get cs
NAME                 STATUS    MESSAGE             ERROR
scheduler            Healthy   ok                  
etcd-0               Healthy   {
    
    "health":"true"}   
controller-manager   Healthy   ok   

[4] ポッドネットワークのインストール

Kubernetes クラスターが機能するには、ポッド ネットワークがインストールされている必要があります。インストールされていない場合、ポッドは相互に通信できません。

Kubernetes はさまざまなネットワーク ソリューションをサポートしていますが、ここでは最初に flannel を使用し、Canal については後で説明します。

[k8s@k8s1 ~]$  [root@server1 ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
bash: [root@server1: command not found...
[k8s@k8s1 ~]$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
podsecuritypolicy.policy/psp.flannel.unprivileged created
Warning: rbac.authorization.k8s.io/v1beta1 ClusterRole is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRole
clusterrole.rbac.authorization.k8s.io/flannel created
Warning: rbac.authorization.k8s.io/v1beta1 ClusterRoleBinding is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRoleBinding
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds-amd64 created
daemonset.apps/kube-flannel-ds-arm64 created
daemonset.apps/kube-flannel-ds-arm created
daemonset.apps/kube-flannel-ds-ppc64le created
daemonset.apps/kube-flannel-ds-s390x created

各ノードがkubeletを起動します

systemctl restart kubelet
とその他のイメージのダウンロードが完了すると、ノードのステータスが準備完了であることがわかります。

[k8s@k8s1 ~]$ kubectl  get node
NAME   STATUS     ROLES    AGE   VERSION
k8s1   Ready      master   79m   v1.19.1
k8s2   NotReady   <none>   60s   v1.19.1
k8s3   NotReady   <none>   30s   v1.19.1

この時点で、ポッドの情報が表示されます。


[k8s@k8s1 ~]$ kubectl get pod -n kube-system
NAME                           READY   STATUS    RESTARTS   AGE
coredns-6d56c8448f-cfk4r       1/1     Running   0          80m
coredns-6d56c8448f-qd9df       1/1     Running   0          80m
etcd-k8s1                      1/1     Running   0          80m
kube-apiserver-k8s1            1/1     Running   0          80m
kube-controller-manager-k8s1   1/1     Running   0          80m
kube-flannel-ds-amd64-6mhhm    1/1     Running   0          2m38s
kube-flannel-ds-amd64-bjvg2    1/1     Running   0          10m
kube-flannel-ds-amd64-kcc2j    1/1     Running   0          2m
kube-proxy-k7vxd               1/1     Running   0          80m
kube-proxy-kl54p               1/1     Running   0          2m
kube-proxy-pz6pt               1/1     Running   0          2m38s
kube-scheduler-k8s1            1/1     Running   0          80m

[k8s@k8s1 ~]$ kubectl  get node
NAME   STATUS   ROLES    AGE     VERSION
k8s1   Ready    master   81m     v1.19.1
k8s2   Ready    <none>   3m32s   v1.19.1
k8s3   Ready    <none>   3m2s    v1.19.1
添加 node1 和 node2

ステップ 1: 環境の準備

実験の準備は完了しました

1. ノードがファイアウォールと selinux を閉じます。

2. スワップを無効にする

ホスト名の解決
4. カーネル機能の起動

kubeletを開始する

起動時に自動的に起動するように設定するだけです

systemctl Enable kubelet
ステップ 2: ノードを追加する

ここでの --token は、前の kubeadm init 出力プロンプトから取得されます。その時点で記録されていない場合は、kubeadm トークン リストで確認できます。

追加する必要があるノード上で実行します。

kubeadm join 172.20.10.2:6443 --token rn816q.zj0crlasganmrzsr --discovery-token-ca-cert-hash sha256:e339e4dbf6bd1323c13e794760fff3cbeb7a3f6f42b71d4cb3cffdde72179903

ステップ 3: ノードを表示する

上の最後の行の出力情報に従ってノードを表示します。

[root@server1 ~]# kubectl get nodes
NAME      STATUS     ROLES    AGE     VERSION
server1   Ready      master   38m     v1.18.1
server2   NotReady   <none>   2m41s   v1.18.1
server3   NotReady   <none>   2m10s   v1.18.1

ここでは実際にはしばらく待つ必要があります。server2、server3 ノードは準備完了状態になります。これは、ノードが 4 つのミラー フランネル coredns kube-proxy をダウンロードする必要があるためです。

しばらくしてからノードの状態を確認してください

[root@server1 ~]# kubectl get nodes
NAME      STATUS   ROLES    AGE   VERSION
server1   Ready    master   47m   v1.18.1
server2   Ready    <none>   11m   v1.18.1
server3   Ready    <none>   11m   v1.18.1

おすすめ

転載: blog.csdn.net/weixin_46268244/article/details/109137004