【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