Install Multi-Node Kubernetes Cluster
System Setup
Package | Version |
---|---|
OS | RHEL 7.6 |
Kubernetes | 1.24.0 |
Container Runtime | Containerd |
Server Name | Role | CPU | RAM | Private IP | Internet Facing IP |
---|---|---|---|---|---|
kube-master1 | Master | 2 vCPU | 2GB | 192.168.50.171 | 192.168.1.171 |
kube-worker1 | Worker1 | 2 vCPU | 2GB | 192.168.50.175 | 192.168.1.175 |
kube-worker2 | Worker2 | 2 vCPU | 2GB | 192.168.50.176 | 192.168.1.176 |
Initial Configuration
Note: Perform these steps on all Master and Worker servers
- Login as root user or user having root privileges
- Setup hosts file with the master and worker node entries
- Disable SWAP
- Add br_netfilter module
- Setup kernel parameter
- Create user named "kadmin"
- Grant SUDO privileges to kadmin user
- Disable SELINUX and IPTABLES
# vi /etc/hosts
192.168.50.171 kube-master1 kube-master1.linuxtechspace.com
192.168.50.175 kube-worker1 kube-worker1.linuxtechspace.com
192.168.50.176 kube-worker2 kube-worker2.linuxtechspace.com
# swapoff -a
# vi /etc/fstab Comment entry containing keyword "swap"
# vi /etc/fstab Comment entry containing keyword "swap"
# vi /etc/modules-load.d/k8s.conf
br_netfilter
# modprobe br_netfilter
# swapoff -a
# vi /etc/sysctl.conf net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 # sysctl -p
# vi /etc/sysctl.conf net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 # sysctl -p
# useradd kadmin
# vi /etc/sudoers
kadmin ALL=(ALL) NOPASSWD:ALL
Install Container Runtime (containerd)
Note: Perform these steps on all Master and Worker servers
- Create YUM Repo file
- Install container.io package
- Enable container runtime
- Restart and Enable containerd service
# vi /etc/yum.repos.d/docker-ce.repo
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://download.docker.com/linux/centos/$releasever/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
[centos-extra]
name=CentOS extra
baseurl=http://mirror.centos.org/centos/7/extras/x86_64/
enabled=1
gpgcheck=0
# swapoff -a
# yum -y install containerd.io Loaded plugins: product-id, search-disabled-repos, subscription-manager This system is not registered with an entitlement server. You can use subscription-manager to register. centos-extra | 2.9 kB 00:00:00 docker-ce-stable | 3.5 kB 00:00:00 localrepo | 3.7 kB 00:00:00 (1/4): localrepo/group_gz | 144 kB 00:00:00 (2/4): centos-extra/primary_db | 247 kB 00:00:00 (3/4): docker-ce-stable/7Server/x86_64/updateinfo | 55 B 00:00:00 (4/4): docker-ce-stable/7Server/x86_64/primary_db | 78 kB 00:00:00 Resolving Dependencies --> Running transaction check ---> Package containerd.io.x86_64 0:1.6.4-3.1.el7 will be installed --> Processing Dependency: container-selinux >= 2:2.74 for package: containerd.io-1.6.4-3.1.el7.x86_64 --> Running transaction check ---> Package container-selinux.noarch 2:2.119.2-1.911c772.el7_8 will be installed --> Processing Dependency: policycoreutils-python for package: 2:container-selinux-2.119.2-1.911c772.el7_8.noarch --> Running transaction check ---> Package policycoreutils-python.x86_64 0:2.5-29.el7 will be installed --> Processing Dependency: setools-libs >= 3.3.8-4 for package: policycoreutils-python-2.5-29.el7.x86_64 --> Processing Dependency: libsemanage-python >= 2.5-14 for package: policycoreutils-python-2.5-29.el7.x86_64 --> Processing Dependency: audit-libs-python >= 2.1.3-4 for package: policycoreutils-python-2.5-29.el7.x86_64 --> Processing Dependency: python-IPy for package: policycoreutils-python-2.5-29.el7.x86_64 --> Processing Dependency: libqpol.so.1(VERS_1.4)(64bit) for package: policycoreutils-python-2.5-29.el7.x86_64 --> Processing Dependency: libqpol.so.1(VERS_1.2)(64bit) for package: policycoreutils-python-2.5-29.el7.x86_64 --> Processing Dependency: libcgroup for package: policycoreutils-python-2.5-29.el7.x86_64 --> Processing Dependency: libapol.so.4(VERS_4.0)(64bit) for package: policycoreutils-python-2.5-29.el7.x86_64 --> Processing Dependency: checkpolicy for package: policycoreutils-python-2.5-29.el7.x86_64 --> Processing Dependency: libqpol.so.1()(64bit) for package: policycoreutils-python-2.5-29.el7.x86_64 --> Processing Dependency: libapol.so.4()(64bit) for package: policycoreutils-python-2.5-29.el7.x86_64 --> Running transaction check ---> Package audit-libs-python.x86_64 0:2.8.4-4.el7 will be installed ---> Package checkpolicy.x86_64 0:2.5-8.el7 will be installed ---> Package libcgroup.x86_64 0:0.41-20.el7 will be installed ---> Package libsemanage-python.x86_64 0:2.5-14.el7 will be installed ---> Package python-IPy.noarch 0:0.75-6.el7 will be installed ---> Package setools-libs.x86_64 0:3.3.8-4.el7 will be installed --> Finished Dependency Resolution Dependencies Resolved ============================================================================================================================================================== Package Arch Version Repository Size ============================================================================================================================================================== Installing: containerd.io x86_64 1.6.4-3.1.el7 docker-ce-stable 33 M Installing for dependencies: audit-libs-python x86_64 2.8.4-4.el7 localrepo 76 k checkpolicy x86_64 2.5-8.el7 localrepo 295 k container-selinux noarch 2:2.119.2-1.911c772.el7_8 centos-extra 40 k libcgroup x86_64 0.41-20.el7 localrepo 66 k libsemanage-python x86_64 2.5-14.el7 localrepo 113 k policycoreutils-python x86_64 2.5-29.el7 localrepo 456 k python-IPy noarch 0.75-6.el7 localrepo 32 k setools-libs x86_64 3.3.8-4.el7 localrepo 620 k Transaction Summary ============================================================================================================================================================== Install 1 Package (+8 Dependent packages) Total download size: 35 M Installed size: 130 M Downloading packages: (1/9): audit-libs-python-2.8.4-4.el7.x86_64.rpm | 76 kB 00:00:00 (2/9): checkpolicy-2.5-8.el7.x86_64.rpm | 295 kB 00:00:00 (3/9): libcgroup-0.41-20.el7.x86_64.rpm | 66 kB 00:00:00 (4/9): libsemanage-python-2.5-14.el7.x86_64.rpm | 113 kB 00:00:00 (5/9): policycoreutils-python-2.5-29.el7.x86_64.rpm | 456 kB 00:00:00 (6/9): setools-libs-3.3.8-4.el7.x86_64.rpm | 620 kB 00:00:00 (7/9): python-IPy-0.75-6.el7.noarch.rpm | 32 kB 00:00:00 (8/9): container-selinux-2.119.2-1.911c772.el7_8.noarch.rpm | 40 kB 00:00:00 warning: /var/cache/yum/x86_64/7Server/docker-ce-stable/packages/containerd.io-1.6.4-3.1.el7.x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID 621e9f35: NOKEY Public key for containerd.io-1.6.4-3.1.el7.x86_64.rpm is not installed (9/9): containerd.io-1.6.4-3.1.el7.x86_64.rpm | 33 MB 00:00:02 -------------------------------------------------------------------------------------------------------------------------------------------------------------- Total 12 MB/s | 35 MB 00:00:02 Retrieving key from https://download.docker.com/linux/centos/gpg Importing GPG key 0x621E9F35: Userid : "Docker Release (CE rpm)"
Fingerprint: 060a 61c5 1b55 8a7f 742b 77aa c52f eb6b 621e 9f35
From : https://download.docker.com/linux/centos/gpg
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : audit-libs-python-2.8.4-4.el7.x86_64 1/9
Installing : setools-libs-3.3.8-4.el7.x86_64 2/9
Installing : python-IPy-0.75-6.el7.noarch 3/9
Installing : libsemanage-python-2.5-14.el7.x86_64 4/9
Installing : checkpolicy-2.5-8.el7.x86_64 5/9
Installing : libcgroup-0.41-20.el7.x86_64 6/9
Installing : policycoreutils-python-2.5-29.el7.x86_64 7/9
Installing : 2:container-selinux-2.119.2-1.911c772.el7_8.noarch 8/9
setsebool: SELinux is disabled.
Installing : containerd.io-1.6.4-3.1.el7.x86_64 9/9
Verifying : libcgroup-0.41-20.el7.x86_64 1/9
Verifying : checkpolicy-2.5-8.el7.x86_64 2/9
Verifying : libsemanage-python-2.5-14.el7.x86_64 3/9
Verifying : policycoreutils-python-2.5-29.el7.x86_64 4/9
Verifying : 2:container-selinux-2.119.2-1.911c772.el7_8.noarch 5/9
Verifying : python-IPy-0.75-6.el7.noarch 6/9
Verifying : containerd.io-1.6.4-3.1.el7.x86_64 7/9
Verifying : setools-libs-3.3.8-4.el7.x86_64 8/9
Verifying : audit-libs-python-2.8.4-4.el7.x86_64 9/9
Installed:
containerd.io.x86_64 0:1.6.4-3.1.el7
Dependency Installed:
audit-libs-python.x86_64 0:2.8.4-4.el7 checkpolicy.x86_64 0:2.5-8.el7 container-selinux.noarch 2:2.119.2-1.911c772.el7_8
libcgroup.x86_64 0:0.41-20.el7 libsemanage-python.x86_64 0:2.5-14.el7 policycoreutils-python.x86_64 0:2.5-29.el7
python-IPy.noarch 0:0.75-6.el7 setools-libs.x86_64 0:3.3.8-4.el7
Complete!
# yum -y install containerd.io Loaded plugins: product-id, search-disabled-repos, subscription-manager This system is not registered with an entitlement server. You can use subscription-manager to register. centos-extra | 2.9 kB 00:00:00 docker-ce-stable | 3.5 kB 00:00:00 localrepo | 3.7 kB 00:00:00 (1/4): localrepo/group_gz | 144 kB 00:00:00 (2/4): centos-extra/primary_db | 247 kB 00:00:00 (3/4): docker-ce-stable/7Server/x86_64/updateinfo | 55 B 00:00:00 (4/4): docker-ce-stable/7Server/x86_64/primary_db | 78 kB 00:00:00 Resolving Dependencies --> Running transaction check ---> Package containerd.io.x86_64 0:1.6.4-3.1.el7 will be installed --> Processing Dependency: container-selinux >= 2:2.74 for package: containerd.io-1.6.4-3.1.el7.x86_64 --> Running transaction check ---> Package container-selinux.noarch 2:2.119.2-1.911c772.el7_8 will be installed --> Processing Dependency: policycoreutils-python for package: 2:container-selinux-2.119.2-1.911c772.el7_8.noarch --> Running transaction check ---> Package policycoreutils-python.x86_64 0:2.5-29.el7 will be installed --> Processing Dependency: setools-libs >= 3.3.8-4 for package: policycoreutils-python-2.5-29.el7.x86_64 --> Processing Dependency: libsemanage-python >= 2.5-14 for package: policycoreutils-python-2.5-29.el7.x86_64 --> Processing Dependency: audit-libs-python >= 2.1.3-4 for package: policycoreutils-python-2.5-29.el7.x86_64 --> Processing Dependency: python-IPy for package: policycoreutils-python-2.5-29.el7.x86_64 --> Processing Dependency: libqpol.so.1(VERS_1.4)(64bit) for package: policycoreutils-python-2.5-29.el7.x86_64 --> Processing Dependency: libqpol.so.1(VERS_1.2)(64bit) for package: policycoreutils-python-2.5-29.el7.x86_64 --> Processing Dependency: libcgroup for package: policycoreutils-python-2.5-29.el7.x86_64 --> Processing Dependency: libapol.so.4(VERS_4.0)(64bit) for package: policycoreutils-python-2.5-29.el7.x86_64 --> Processing Dependency: checkpolicy for package: policycoreutils-python-2.5-29.el7.x86_64 --> Processing Dependency: libqpol.so.1()(64bit) for package: policycoreutils-python-2.5-29.el7.x86_64 --> Processing Dependency: libapol.so.4()(64bit) for package: policycoreutils-python-2.5-29.el7.x86_64 --> Running transaction check ---> Package audit-libs-python.x86_64 0:2.8.4-4.el7 will be installed ---> Package checkpolicy.x86_64 0:2.5-8.el7 will be installed ---> Package libcgroup.x86_64 0:0.41-20.el7 will be installed ---> Package libsemanage-python.x86_64 0:2.5-14.el7 will be installed ---> Package python-IPy.noarch 0:0.75-6.el7 will be installed ---> Package setools-libs.x86_64 0:3.3.8-4.el7 will be installed --> Finished Dependency Resolution Dependencies Resolved ============================================================================================================================================================== Package Arch Version Repository Size ============================================================================================================================================================== Installing: containerd.io x86_64 1.6.4-3.1.el7 docker-ce-stable 33 M Installing for dependencies: audit-libs-python x86_64 2.8.4-4.el7 localrepo 76 k checkpolicy x86_64 2.5-8.el7 localrepo 295 k container-selinux noarch 2:2.119.2-1.911c772.el7_8 centos-extra 40 k libcgroup x86_64 0.41-20.el7 localrepo 66 k libsemanage-python x86_64 2.5-14.el7 localrepo 113 k policycoreutils-python x86_64 2.5-29.el7 localrepo 456 k python-IPy noarch 0.75-6.el7 localrepo 32 k setools-libs x86_64 3.3.8-4.el7 localrepo 620 k Transaction Summary ============================================================================================================================================================== Install 1 Package (+8 Dependent packages) Total download size: 35 M Installed size: 130 M Downloading packages: (1/9): audit-libs-python-2.8.4-4.el7.x86_64.rpm | 76 kB 00:00:00 (2/9): checkpolicy-2.5-8.el7.x86_64.rpm | 295 kB 00:00:00 (3/9): libcgroup-0.41-20.el7.x86_64.rpm | 66 kB 00:00:00 (4/9): libsemanage-python-2.5-14.el7.x86_64.rpm | 113 kB 00:00:00 (5/9): policycoreutils-python-2.5-29.el7.x86_64.rpm | 456 kB 00:00:00 (6/9): setools-libs-3.3.8-4.el7.x86_64.rpm | 620 kB 00:00:00 (7/9): python-IPy-0.75-6.el7.noarch.rpm | 32 kB 00:00:00 (8/9): container-selinux-2.119.2-1.911c772.el7_8.noarch.rpm | 40 kB 00:00:00 warning: /var/cache/yum/x86_64/7Server/docker-ce-stable/packages/containerd.io-1.6.4-3.1.el7.x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID 621e9f35: NOKEY Public key for containerd.io-1.6.4-3.1.el7.x86_64.rpm is not installed (9/9): containerd.io-1.6.4-3.1.el7.x86_64.rpm | 33 MB 00:00:02 -------------------------------------------------------------------------------------------------------------------------------------------------------------- Total 12 MB/s | 35 MB 00:00:02 Retrieving key from https://download.docker.com/linux/centos/gpg Importing GPG key 0x621E9F35: Userid : "Docker Release (CE rpm)
Comment the entry containing "cri" parameter.
# vi /etc/containerd/config.toml
# disabled_plugins = ["cri"]
# systemctl restart containerd
# systemctl enable containerd
# systemctl enable containerd
Install Kubernetes
Note: Perform these steps on all Master and Worker servers
- Setup YUM repo file
- Install kubernetes
- Start & Enable kubelet service
# vi /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
# yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
Loaded plugins: product-id, search-disabled-repos, subscription-manager
This system is not registered with an entitlement server. You can use subscription-manager to register.
kubernetes | 1.4 kB 00:00:00
kubernetes/x86_64/primary | 108 kB 00:00:00
kubernetes 797/797
Resolving Dependencies
--> Running transaction check
---> Package kubeadm.x86_64 0:1.24.0-0 will be installed
--> Processing Dependency: kubernetes-cni >= 0.8.6 for package: kubeadm-1.24.0-0.x86_64
--> Processing Dependency: cri-tools >= 1.19.0 for package: kubeadm-1.24.0-0.x86_64
---> Package kubectl.x86_64 0:1.24.0-0 will be installed
---> Package kubelet.x86_64 0:1.24.0-0 will be installed
--> Processing Dependency: socat for package: kubelet-1.24.0-0.x86_64
--> Processing Dependency: conntrack for package: kubelet-1.24.0-0.x86_64
--> Running transaction check
---> Package conntrack-tools.x86_64 0:1.4.4-4.el7 will be installed
--> Processing Dependency: libnetfilter_cttimeout.so.1(LIBNETFILTER_CTTIMEOUT_1.1)(64bit) for package: conntrack-tools-1.4.4-4.el7.x86_64
--> Processing Dependency: libnetfilter_cttimeout.so.1(LIBNETFILTER_CTTIMEOUT_1.0)(64bit) for package: conntrack-tools-1.4.4-4.el7.x86_64
--> Processing Dependency: libnetfilter_cthelper.so.0(LIBNETFILTER_CTHELPER_1.0)(64bit) for package: conntrack-tools-1.4.4-4.el7.x86_64
--> Processing Dependency: libnetfilter_queue.so.1()(64bit) for package: conntrack-tools-1.4.4-4.el7.x86_64
--> Processing Dependency: libnetfilter_cttimeout.so.1()(64bit) for package: conntrack-tools-1.4.4-4.el7.x86_64
--> Processing Dependency: libnetfilter_cthelper.so.0()(64bit) for package: conntrack-tools-1.4.4-4.el7.x86_64
---> Package cri-tools.x86_64 0:1.23.0-0 will be installed
---> Package kubernetes-cni.x86_64 0:0.8.7-0 will be installed
---> Package socat.x86_64 0:1.7.3.2-2.el7 will be installed
--> Running transaction check
---> Package libnetfilter_cthelper.x86_64 0:1.0.0-9.el7 will be installed
---> Package libnetfilter_cttimeout.x86_64 0:1.0.0-6.el7 will be installed
---> Package libnetfilter_queue.x86_64 0:1.0.2-2.el7_2 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
==============================================================================================================================================================
Package Arch Version Repository Size
==============================================================================================================================================================
Installing:
kubeadm x86_64 1.24.0-0 kubernetes 9.5 M
kubectl x86_64 1.24.0-0 kubernetes 9.9 M
kubelet x86_64 1.24.0-0 kubernetes 20 M
Installing for dependencies:
conntrack-tools x86_64 1.4.4-4.el7 localrepo 186 k
cri-tools x86_64 1.23.0-0 kubernetes 7.1 M
kubernetes-cni x86_64 0.8.7-0 kubernetes 19 M
libnetfilter_cthelper x86_64 1.0.0-9.el7 localrepo 18 k
libnetfilter_cttimeout x86_64 1.0.0-6.el7 localrepo 18 k
libnetfilter_queue x86_64 1.0.2-2.el7_2 localrepo 23 k
socat x86_64 1.7.3.2-2.el7 localrepo 290 k
Transaction Summary
==============================================================================================================================================================
Install 3 Packages (+7 Dependent packages)
Total download size: 66 M
Installed size: 288 M
Downloading packages:
(1/10): conntrack-tools-1.4.4-4.el7.x86_64.rpm | 186 kB 00:00:00
warning: /var/cache/yum/x86_64/7Server/kubernetes/packages/4d300a7655f56307d35f127d99dc192b6aa4997f322234e754f16aaa60fd8906-cri-tools-1.23.0-0.x86_64.rpm: Header V4 RSA/SHA512 Signature, key ID 3e1ba8d5: NOKEY
Public key for 4d300a7655f56307d35f127d99dc192b6aa4997f322234e754f16aaa60fd8906-cri-tools-1.23.0-0.x86_64.rpm is not installed
(2/10): 4d300a7655f56307d35f127d99dc192b6aa4997f322234e754f16aaa60fd8906-cri-tools-1.23.0-0.x86_64.rpm | 7.1 MB 00:00:01
(3/10): dda11ee75bc7fcb01e32512cefb8f686dc6a7383516b8b0828adb33761fe602e-kubeadm-1.24.0-0.x86_64.rpm | 9.5 MB 00:00:02
(4/10): 0c7a02e05273d05ea82ca13546853b65fbc257dd159565ce6eb658a0bdf31c9f-kubectl-1.24.0-0.x86_64.rpm | 9.9 MB 00:00:01
(5/10): libnetfilter_cthelper-1.0.0-9.el7.x86_64.rpm | 18 kB 00:00:00
(6/10): libnetfilter_queue-1.0.2-2.el7_2.x86_64.rpm | 23 kB 00:00:00
(7/10): socat-1.7.3.2-2.el7.x86_64.rpm | 290 kB 00:00:00
(8/10): libnetfilter_cttimeout-1.0.0-6.el7.x86_64.rpm | 18 kB 00:00:00
(9/10): db7cb5cb0b3f6875f54d10f02e625573988e3e91fd4fc5eef0b1876bb18604ad-kubernetes-cni-0.8.7-0.x86_64.rpm | 19 MB 00:00:02
(10/10): 363f3fbfa8b89bb978e2d089e52ba59847f143834f8ea1b559afa864d8c5c011-kubelet-1.24.0-0.x86_64.rpm | 20 MB 00:00:02
--------------------------------------------------------------------------------------------------------------------------------------------------------------
Total 13 MB/s | 66 MB 00:00:05
Retrieving key from https://packages.cloud.google.com/yum/doc/yum-key.gpg
Importing GPG key 0x6B4097C2:
Userid : "Rapture Automatic Signing Key (cloud-rapture-signing-key-2022-03-07-08_01_01.pub)"
Fingerprint: e936 7157 4236 81a4 7ec3 93c3 7325 816a 6b40 97c2
From : https://packages.cloud.google.com/yum/doc/yum-key.gpg
Importing GPG key 0x307EA071:
Userid : "Rapture Automatic Signing Key (cloud-rapture-signing-key-2021-03-01-08_01_09.pub)"
Fingerprint: 7f92 e05b 3109 3bef 5a3c 2d38 feea 9169 307e a071
From : https://packages.cloud.google.com/yum/doc/yum-key.gpg
Importing GPG key 0x836F4BEB:
Userid : "gLinux Rapture Automatic Signing Key (//depot/google3/production/borg/cloud-rapture/keys/cloud-rapture-pubkeys/cloud-rapture-signing-key-2020-12-03-16_08_05.pub) "
Fingerprint: 59fe 0256 8272 69dc 8157 8f92 8b57 c5c2 836f 4beb
From : https://packages.cloud.google.com/yum/doc/yum-key.gpg
Retrieving key from https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
Importing GPG key 0x3E1BA8D5:
Userid : "Google Cloud Packages RPM Signing Key "
Fingerprint: 3749 e1ba 95a8 6ce0 5454 6ed2 f09c 394c 3e1b a8d5
From : https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : socat-1.7.3.2-2.el7.x86_64 1/10
Installing : cri-tools-1.23.0-0.x86_64 2/10
Installing : libnetfilter_cthelper-1.0.0-9.el7.x86_64 3/10
Installing : libnetfilter_queue-1.0.2-2.el7_2.x86_64 4/10
Installing : kubectl-1.24.0-0.x86_64 5/10
Installing : libnetfilter_cttimeout-1.0.0-6.el7.x86_64 6/10
Installing : conntrack-tools-1.4.4-4.el7.x86_64 7/10
Installing : kubelet-1.24.0-0.x86_64 8/10
Installing : kubernetes-cni-0.8.7-0.x86_64 9/10
Installing : kubeadm-1.24.0-0.x86_64 10/10
Verifying : kubernetes-cni-0.8.7-0.x86_64 1/10
Verifying : kubeadm-1.24.0-0.x86_64 2/10
Verifying : libnetfilter_cttimeout-1.0.0-6.el7.x86_64 3/10
Verifying : kubectl-1.24.0-0.x86_64 4/10
Verifying : libnetfilter_queue-1.0.2-2.el7_2.x86_64 5/10
Verifying : libnetfilter_cthelper-1.0.0-9.el7.x86_64 6/10
Verifying : cri-tools-1.23.0-0.x86_64 7/10
Verifying : conntrack-tools-1.4.4-4.el7.x86_64 8/10
Verifying : socat-1.7.3.2-2.el7.x86_64 9/10
Verifying : kubelet-1.24.0-0.x86_64 10/10
Installed:
kubeadm.x86_64 0:1.24.0-0 kubectl.x86_64 0:1.24.0-0 kubelet.x86_64 0:1.24.0-0
Dependency Installed:
conntrack-tools.x86_64 0:1.4.4-4.el7 cri-tools.x86_64 0:1.23.0-0 kubernetes-cni.x86_64 0:0.8.7-0
libnetfilter_cthelper.x86_64 0:1.0.0-9.el7 libnetfilter_cttimeout.x86_64 0:1.0.0-6.el7 libnetfilter_queue.x86_64 0:1.0.2-2.el7_2
socat.x86_64 0:1.7.3.2-2.el7
Complete!
# systemctl start kubelet
# systemctl enable kubelet
# systemctl enable kubelet
Setup Kubernetes Cluster
Note: Perform these steps only on Master node
- Login as non-privileged user kadmin
- Create a new cluster
- Setup configuration file
- Check Status of Cluster Node
- Check Status of PODS
- Disable "NoSchedule" parameter for Master node if you want it to run pods. This is optional step.
- Install calico for enabling pod networking
- Check the status of Master node and should be in Ready state.
- Check the status of PODS. All PODS should be in Running state.
- Generate Token for Worker Nodes to join the cluster
# su - kadmin
# sudo kubeadm init --control-plane-endpoint=192.168.50.171 --apiserver-advertise-address=192.168.50.171 --pod-network-cidr=192.168.0.0/16
[init] Using Kubernetes version: v1.24.0
[preflight] Running pre-flight checks
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Generating "ca" certificate and key
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [kube-master1.linuxtechspace.com kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 192.168.50.171]
[certs] Generating "apiserver-kubelet-client" certificate and key
[certs] Generating "front-proxy-ca" certificate and key
[certs] Generating "front-proxy-client" certificate and key
[certs] Generating "etcd/ca" certificate and key
[certs] Generating "etcd/server" certificate and key
[certs] etcd/server serving cert is signed for DNS names [kube-master1.linuxtechspace.com localhost] and IPs [192.168.50.171 127.0.0.1 ::1]
[certs] Generating "etcd/peer" certificate and key
[certs] etcd/peer serving cert is signed for DNS names [kube-master1.linuxtechspace.com localhost] and IPs [192.168.50.171 127.0.0.1 ::1]
[certs] Generating "etcd/healthcheck-client" certificate and key
[certs] Generating "apiserver-etcd-client" certificate and key
[certs] Generating "sa" key and public key
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "kubelet.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Starting the kubelet
[control-plane] Using manifest folder "/etc/kubernetes/manifests"
[control-plane] Creating static Pod manifest for "kube-apiserver"
[control-plane] Creating static Pod manifest for "kube-controller-manager"
[control-plane] Creating static Pod manifest for "kube-scheduler"
[etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"
[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
[apiclient] All control plane components are healthy after 12.091188 seconds
[upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[kubelet] Creating a ConfigMap "kubelet-config" in namespace kube-system with the configuration for the kubelets in the cluster
[upload-certs] Skipping phase. Please see --upload-certs
[mark-control-plane] Marking the node kube-master1.linuxtechspace.com as control-plane by adding the labels: [node-role.kubernetes.io/control-plane node.kubernetes.io/exclude-from-external-load-balancers]
[mark-control-plane] Marking the node kube-master1.linuxtechspace.com as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule node-role.kubernetes.io/control-plane:NoSchedule]
[bootstrap-token] Using token: d0rjy8.fezbmqce1ekfohrr
[bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles
[bootstrap-token] Configured RBAC rules to allow Node Bootstrap tokens to get nodes
[bootstrap-token] Configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstrap-token] Configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstrap-token] Configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy
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
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
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/
You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:
kubeadm join 192.168.50.171:6443 --token d0rjy8.fezbmqce1ekfohrr \
--discovery-token-ca-cert-hash sha256:0b156b722cbd38ed443cbc854d2f86eca42f4c9de2e6ffe26fc45dba01fefa3e \
--control-plane
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.50.171:6443 --token d0rjy8.fezbmqce1ekfohrr \
--discovery-token-ca-cert-hash sha256:0b156b722cbd38ed443cbc854d2f86eca42f4c9de2e6ffe26fc45dba01fefa3e
# mkdir -p $HOME/.kube
# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# sudo chown $(id -u):$(id -g) $HOME/.kube/config
# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# sudo chown $(id -u):$(id -g) $HOME/.kube/config
# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
kube-master1.linuxtechspace.com NotReady control-plane 106s v1.24.0 192.168.50.171 Red Hat Enterprise Linux Server 7.6 (Maipo) 3.10.0-957.el7.x86_64 containerd://1.6.4
# kubectl get pods -A -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-system coredns-6d4b75cb6d-d74kz 0/1 Pending 0 110s
kube-system coredns-6d4b75cb6d-jjncb 0/1 Pending 0 110s
kube-system etcd-kube-master1.linuxtechspace.com 1/1 Running 0 2m7s 192.168.50.171 kube-master1.linuxtechspace.com
kube-system kube-apiserver-kube-master1.linuxtechspace.com 1/1 Running 0 2m8s 192.168.50.171 kube-master1.linuxtechspace.com
kube-system kube-controller-manager-kube-master1.linuxtechspace.com 1/1 Running 1 2m5s 192.168.50.171 kube-master1.linuxtechspace.com
kube-system kube-proxy-4765m 1/1 Running 0 110s 192.168.50.171 kube-master1.linuxtechspace.com
kube-system kube-scheduler-kube-master1.linuxtechspace.com 1/1 Running 1 2m6s 192.168.50.171 kube-master1.linuxtechspace.com
Note: The Node Status is showing "NotReady" and there are two DNS pods that are in "pending" state. This is because the pod networking is not installed yet. We will install Calico in next step to enable pod networking.
Install Calico (POD Networking)
# kubectl taint node kube-master1.linuxtechspace.com node-role.kubernetes.io/control-plane:NoSchedule-
node/kube-master1.linuxtechspace.com untainted
# kubectl create -f https://docs.projectcalico.org/manifests/calico.yaml
configmap/calico-config created
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/caliconodestatuses.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipreservations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created
clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrole.rbac.authorization.k8s.io/calico-node created
clusterrolebinding.rbac.authorization.k8s.io/calico-node created
daemonset.apps/calico-node created
serviceaccount/calico-node created
deployment.apps/calico-kube-controllers created
serviceaccount/calico-kube-controllers created
poddisruptionbudget.policy/calico-kube-controllers created
# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
kube-master1.linuxtechspace.com Ready control-plane 16m v1.24.0 192.168.50.171 Red Hat Enterprise Linux Server 7.6 (Maipo) 3.10.0-957.el7.x86_64 containerd://1.6.4
# kubectl get pods -A -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-system calico-kube-controllers-56cdb7c587-hfxv9 1/1 Running 0 3m16s 192.168.37.130 kube-master1.linuxtechspace.com
kube-system calico-node-g7rvz 1/1 Running 0 3m16s 192.168.50.171 kube-master1.linuxtechspace.com
kube-system coredns-6d4b75cb6d-d74kz 1/1 Running 0 9m50s 192.168.37.131 kube-master1.linuxtechspace.com
kube-system coredns-6d4b75cb6d-jjncb 1/1 Running 0 9m50s 192.168.37.129 kube-master1.linuxtechspace.com
kube-system etcd-kube-master1.linuxtechspace.com 1/1 Running 0 10m 192.168.50.171 kube-master1.linuxtechspace.com
kube-system kube-apiserver-kube-master1.linuxtechspace.com 1/1 Running 0 10m 192.168.50.171 kube-master1.linuxtechspace.com
kube-system kube-controller-manager-kube-master1.linuxtechspace.com 1/1 Running 1 10m 192.168.50.171 kube-master1.linuxtechspace.com
kube-system kube-proxy-4765m 1/1 Running 0 9m50s 192.168.50.171 kube-master1.linuxtechspace.com
kube-system kube-scheduler-kube-master1.linuxtechspace.com 1/1 Running 1 10m 192.168.50.171 kube-master1.linuxtechspace.com
Note: During cluster install the initial Token is auto generated which can be used. But in case we need to add the worker node later on then we can generate new token and use it to additional join worker nodes.
# kubeadm token create --print-join-command
kubeadm join 192.168.50.171:6443 --token ks2mvm.7ipce60k40ekxmrn --discovery-token-ca-cert-hash sha256:0b156b722cbd38ed443cbc854d2f86eca42f4c9de2e6ffe26fc45dba01fefa3e
Join Worker Node to Cluster
Note: Perform these steps only on all Worker Nodes
- Join both the worker nodes to the cluster.
Note: We need to use the command that was generated in last step using "kubeadm token" command
# swapoff -a
# vi /etc/fstab
[preflight] Running pre-flight checks
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
Check Cluster Status
Note: Perform these steps only on Master node
- Check the Nodes status
Note: All the nodes should be in "Ready" state.
# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
kube-master1.linuxtechspace.com Ready control-plane 40m v1.24.0 192.168.50.171 Red Hat Enterprise Linux Server 7.6 (Maipo) 3.10.0-957.el7.x86_64 containerd://1.6.4
kube-worker1.linuxtechspace.com Ready 3m18s v1.24.0 192.168.50.175 Red Hat Enterprise Linux Server 7.6 (Maipo) 3.10.0-957.el7.x86_64 containerd://1.6.4
kube-worker2.linuxtechspace.com Ready 81s v1.24.0 192.168.50.176 Red Hat Enterprise Linux Server 7.6 (Maipo) 3.10.0-957.el7.x86_64 containerd://1.6.4
- Check the PODS status
Note: All the PODS should be in "Running" state.
# kubectl get pods -A -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-system calico-kube-controllers-56cdb7c587-hfxv9 1/1 Running 0 36m 192.168.37.130 kube-master1.linuxtechspace.com
kube-system calico-node-6hqr4 0/1 Running 2 (36s ago) 3m52s 192.168.50.176 kube-worker2.linuxtechspace.com
kube-system calico-node-g7rvz 1/1 Running 0 36m 192.168.50.171 kube-master1.linuxtechspace.com
kube-system calico-node-jvsm8 0/1 Running 4 (12s ago) 5m49s 192.168.50.175 kube-worker1.linuxtechspace.com
kube-system coredns-6d4b75cb6d-d74kz 1/1 Running 0 43m 192.168.37.131 kube-master1.linuxtechspace.com
kube-system coredns-6d4b75cb6d-jjncb 1/1 Running 0 43m 192.168.37.129 kube-master1.linuxtechspace.com
kube-system etcd-kube-master1.linuxtechspace.com 1/1 Running 0 43m 192.168.50.171 kube-master1.linuxtechspace.com
kube-system kube-apiserver-kube-master1.linuxtechspace.com 1/1 Running 0 43m 192.168.50.171 kube-master1.linuxtechspace.com
kube-system kube-controller-manager-kube-master1.linuxtechspace.com 1/1 Running 1 43m 192.168.50.171 kube-master1.linuxtechspace.com
kube-system kube-proxy-4765m 1/1 Running 0 43m 192.168.50.171 kube-master1.linuxtechspace.com
kube-system kube-proxy-r7kzw 1/1 Running 0 5m49s 192.168.50.175 kube-worker1.linuxtechspace.com
kube-system kube-proxy-xtf4p 1/1 Running 0 3m52s 192.168.50.176 kube-worker2.linuxtechspace.com
kube-system kube-scheduler-kube-master1.linuxtechspace.com 1/1 Running 1 43m 192.168.50.171 kube-master1.linuxtechspace.com
Multi Node Kubernetes cluster setup is complete.
Note: We need to use the command that was generated in last step using "kubeadm token" command
# swapoff -a
# vi /etc/fstab [preflight] Running pre-flight checks [preflight] Reading configuration from the cluster... [preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml' [kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml" [kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env" [kubelet-start] Starting the kubelet [kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap... This node has joined the cluster: * Certificate signing request was sent to apiserver and a response was received. * The Kubelet was informed of the new secure connection details. Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
# vi /etc/fstab [preflight] Running pre-flight checks [preflight] Reading configuration from the cluster... [preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml' [kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml" [kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env" [kubelet-start] Starting the kubelet [kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap... This node has joined the cluster: * Certificate signing request was sent to apiserver and a response was received. * The Kubelet was informed of the new secure connection details. Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
Note: All the nodes should be in "Ready" state.
# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
kube-master1.linuxtechspace.com Ready control-plane 40m v1.24.0 192.168.50.171 Red Hat Enterprise Linux Server 7.6 (Maipo) 3.10.0-957.el7.x86_64 containerd://1.6.4
kube-worker1.linuxtechspace.com Ready 3m18s v1.24.0 192.168.50.175 Red Hat Enterprise Linux Server 7.6 (Maipo) 3.10.0-957.el7.x86_64 containerd://1.6.4
kube-worker2.linuxtechspace.com Ready 81s v1.24.0 192.168.50.176 Red Hat Enterprise Linux Server 7.6 (Maipo) 3.10.0-957.el7.x86_64 containerd://1.6.4
Note: All the PODS should be in "Running" state.
# kubectl get pods -A -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-system calico-kube-controllers-56cdb7c587-hfxv9 1/1 Running 0 36m 192.168.37.130 kube-master1.linuxtechspace.com
kube-system calico-node-6hqr4 0/1 Running 2 (36s ago) 3m52s 192.168.50.176 kube-worker2.linuxtechspace.com
kube-system calico-node-g7rvz 1/1 Running 0 36m 192.168.50.171 kube-master1.linuxtechspace.com
kube-system calico-node-jvsm8 0/1 Running 4 (12s ago) 5m49s 192.168.50.175 kube-worker1.linuxtechspace.com
kube-system coredns-6d4b75cb6d-d74kz 1/1 Running 0 43m 192.168.37.131 kube-master1.linuxtechspace.com
kube-system coredns-6d4b75cb6d-jjncb 1/1 Running 0 43m 192.168.37.129 kube-master1.linuxtechspace.com
kube-system etcd-kube-master1.linuxtechspace.com 1/1 Running 0 43m 192.168.50.171 kube-master1.linuxtechspace.com
kube-system kube-apiserver-kube-master1.linuxtechspace.com 1/1 Running 0 43m 192.168.50.171 kube-master1.linuxtechspace.com
kube-system kube-controller-manager-kube-master1.linuxtechspace.com 1/1 Running 1 43m 192.168.50.171 kube-master1.linuxtechspace.com
kube-system kube-proxy-4765m 1/1 Running 0 43m 192.168.50.171 kube-master1.linuxtechspace.com
kube-system kube-proxy-r7kzw 1/1 Running 0 5m49s 192.168.50.175 kube-worker1.linuxtechspace.com
kube-system kube-proxy-xtf4p 1/1 Running 0 3m52s 192.168.50.176 kube-worker2.linuxtechspace.com
kube-system kube-scheduler-kube-master1.linuxtechspace.com 1/1 Running 1 43m 192.168.50.171 kube-master1.linuxtechspace.com