{"id":46309,"date":"2024-05-23T04:41:29","date_gmt":"2024-05-23T04:41:29","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=46309"},"modified":"2025-01-23T12:45:09","modified_gmt":"2025-01-23T12:45:09","slug":"how-to-install-kubernetes-ubuntu-22","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/how-to-install-kubernetes-ubuntu-22\/","title":{"rendered":"How to Install Kubernetes: Ubuntu 22"},"content":{"rendered":"<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">================================================================\nStep <span class=\"hljs-number\">1<\/span> - Install Docker \n================================================================\n$ sudo apt-get install ca-certificates curl gnupg lsb-release\n$ sudo mkdir -p \/etc\/apt\/keyrings\n$ curl -fsSL https:<span class=\"hljs-comment\">\/\/download.docker.com\/linux\/ubuntu\/gpg | sudo gpg --dearmor -o \/etc\/apt\/keyrings\/docker.gpg<\/span>\n$ <span class=\"hljs-keyword\">echo<\/span>   <span class=\"hljs-string\">\"deb &#91;arch=$(dpkg --print-architecture) signed-by=\/etc\/apt\/keyrings\/docker.gpg] https:\/\/download.docker.com\/linux\/ubuntu \\\n  $(lsb_release -cs) stable\"<\/span> | sudo tee \/etc\/apt\/sources.<span class=\"hljs-keyword\">list<\/span>.d\/docker.<span class=\"hljs-keyword\">list<\/span> &gt; \/dev\/<span class=\"hljs-keyword\">null<\/span>\n$ sudo apt-get update\n$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin\n$ sudo systemctl enable docker\n$ sudo systemctl status docker\n\n<span class=\"hljs-keyword\">If<\/span> Docker is not running, start it with the following command:\n$ sudo systemctl start docker\n\n================================================================\nStep <span class=\"hljs-number\">2<\/span> - Install kubeadm kubelet kubectl\n================================================================\n$ curl -fsSL https:<span class=\"hljs-comment\">\/\/pkgs.k8s.io\/core:\/stable:\/v1.30\/deb\/Release.key | sudo gpg --dearmor -o \/etc\/apt\/keyrings\/kubernetes-apt-keyring.gpg<\/span>\n$ <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">'deb &#91;signed-by=\/etc\/apt\/keyrings\/kubernetes-apt-keyring.gpg] https:\/\/pkgs.k8s.io\/core:\/stable:\/v1.30\/deb\/ \/'<\/span> | sudo tee \/etc\/apt\/sources.<span class=\"hljs-keyword\">list<\/span>.d\/kubernetes.<span class=\"hljs-keyword\">list<\/span>\n$ sudo apt update\n$ sudo apt install kubeadm kubelet kubectl\n$ sudo apt-mark hold kubeadm kubelet kubectl\n$ kubeadm version\n\n================================================================\nStep <span class=\"hljs-number\">3<\/span> - Prepare <span class=\"hljs-keyword\">for<\/span> Kubernetes Deployment\n================================================================\n\n<span class=\"hljs-comment\"># Disable all swap spaces with the swapoff command:<\/span>\n$ sudo swapoff -a\n\n<span class=\"hljs-comment\"># Then use the sed command below to make the necessary adjustments to the \/etc\/fstab file:<\/span>\n$ sudo sed -i <span class=\"hljs-string\">'\/ swap \/ s\/^\\(.*\\)$\/#\\1\/g'<\/span> \/etc\/fstab\n\n<span class=\"hljs-comment\"># Load the required containerd modules. Start by opening the containerd configuration file in a text editor, such as nano:<\/span>\n\n$ sudo vi \/etc\/modules-load.d\/containerd.conf\n\n<span class=\"hljs-comment\"># Add the following two lines to the file:<\/span>\noverlay\nbr_netfilter\n\n<span class=\"hljs-comment\"># Next, use the modprobe command to add the modules:<\/span>\n\n$ sudo modprobe overlay\n$ sudo modprobe br_netfilter\n\n<span class=\"hljs-comment\"># Open the kubernetes.conf file to configure Kubernetes networking:<\/span>\n$ sudo vi \/etc\/sysctl.d\/kubernetes.conf\n\n<span class=\"hljs-comment\"># Add the following lines to the file:<\/span>\n\nnet.bridge.bridge-nf-call-ip6tables = <span class=\"hljs-number\">1<\/span>\nnet.bridge.bridge-nf-call-iptables = <span class=\"hljs-number\">1<\/span>\nnet.ipv4.ip_forward = <span class=\"hljs-number\">1<\/span>\n\n<span class=\"hljs-comment\"># Reload the configuration by typing:<\/span>\n$ sudo sysctl --system \n\n<span class=\"hljs-comment\"># Assign Unique Hostname for Each Server Node<\/span>\n$ sudo hostnamectl set-hostname master-node\n\n================================================================\nStep <span class=\"hljs-number\">4<\/span>: Configure containerd\n================================================================\n\n<span class=\"hljs-comment\"># Open the kubelet file in a text editor.<\/span>\nNA\n\n<span class=\"hljs-comment\"># Reload the configuration and restart the kubelet:<\/span>\n$ sudo systemctl daemon-reload &amp;&amp; sudo systemctl restart kubelet\n\n<span class=\"hljs-comment\"># Open the Docker daemon configuration file:<\/span>\n\n$ sudo vi \/etc\/docker\/daemon.json\n\n {\n      <span class=\"hljs-string\">\"exec-opts\"<\/span>: &#91;<span class=\"hljs-string\">\"native.cgroupdriver=systemd\"<\/span>],\n      <span class=\"hljs-string\">\"log-driver\"<\/span>: <span class=\"hljs-string\">\"json-file\"<\/span>,\n      <span class=\"hljs-string\">\"log-opts\"<\/span>: {\n      <span class=\"hljs-string\">\"max-size\"<\/span>: <span class=\"hljs-string\">\"100m\"<\/span>\n   },\n\n       <span class=\"hljs-string\">\"storage-driver\"<\/span>: <span class=\"hljs-string\">\"overlay2\"<\/span>\n       }\n\n<span class=\"hljs-comment\"># Reload the configuration and restart Docker:<\/span>\n$ sudo systemctl daemon-reload &amp;&amp; sudo systemctl restart docker\n\n\n\n<span class=\"hljs-comment\">### containerd<\/span>\ncat &lt;&lt;EOF | sudo tee \/etc\/modules-load.d\/containerd.conf\noverlay\nbr_netfilter\nEOF\nsudo modprobe overlay\nsudo modprobe br_netfilter\ncat &lt;&lt;EOF | sudo tee \/etc\/sysctl.d\/<span class=\"hljs-number\">99<\/span>-kubernetes-cri.conf\nnet.bridge.bridge-nf-call-iptables  = <span class=\"hljs-number\">1<\/span>\nnet.ipv4.ip_forward                 = <span class=\"hljs-number\">1<\/span>\nnet.bridge.bridge-nf-call-ip6tables = <span class=\"hljs-number\">1<\/span>\nEOF\nsudo sysctl --system\nsudo mkdir -p \/etc\/containerd\n\n\n<span class=\"hljs-comment\">### containerd config<\/span>\ncat &gt; \/etc\/containerd\/config.toml &lt;&lt;EOF\ndisabled_plugins = &#91;]\nimports = &#91;]\noom_score = <span class=\"hljs-number\">0<\/span>\nplugin_dir = <span class=\"hljs-string\">\"\"<\/span>\nrequired_plugins = &#91;]\nroot = <span class=\"hljs-string\">\"\/var\/lib\/containerd\"<\/span>\nstate = <span class=\"hljs-string\">\"\/run\/containerd\"<\/span>\nversion = <span class=\"hljs-number\">2<\/span>\n\n&#91;plugins]\n\n  &#91;plugins.<span class=\"hljs-string\">\"io.containerd.grpc.v1.cri\"<\/span>.containerd.runtimes]\n    &#91;plugins.<span class=\"hljs-string\">\"io.containerd.grpc.v1.cri\"<\/span>.containerd.runtimes.runc]\n      base_runtime_spec = <span class=\"hljs-string\">\"\"<\/span>\n      container_annotations = &#91;]\n      pod_annotations = &#91;]\n      privileged_without_host_devices = <span class=\"hljs-keyword\">false<\/span>\n      runtime_engine = <span class=\"hljs-string\">\"\"<\/span>\n      runtime_root = <span class=\"hljs-string\">\"\"<\/span>\n      runtime_type = <span class=\"hljs-string\">\"io.containerd.runc.v2\"<\/span>\n\n      &#91;plugins.<span class=\"hljs-string\">\"io.containerd.grpc.v1.cri\"<\/span>.containerd.runtimes.runc.options]\n        BinaryName = <span class=\"hljs-string\">\"\"<\/span>\n        CriuImagePath = <span class=\"hljs-string\">\"\"<\/span>\n        CriuPath = <span class=\"hljs-string\">\"\"<\/span>\n        CriuWorkPath = <span class=\"hljs-string\">\"\"<\/span>\n        IoGid = <span class=\"hljs-number\">0<\/span>\n        IoUid = <span class=\"hljs-number\">0<\/span>\n        NoNewKeyring = <span class=\"hljs-keyword\">false<\/span>\n        NoPivotRoot = <span class=\"hljs-keyword\">false<\/span>\n        Root = <span class=\"hljs-string\">\"\"<\/span>\n        ShimCgroup = <span class=\"hljs-string\">\"\"<\/span>\n        SystemdCgroup = <span class=\"hljs-keyword\">true<\/span>\nEOF\n\n\n<span class=\"hljs-comment\">### crictl uses containerd as default<\/span>\n{\ncat &lt;&lt;EOF | sudo tee \/etc\/crictl.yaml\nruntime-endpoint: unix:<span class=\"hljs-comment\">\/\/\/run\/containerd\/containerd.sock<\/span>\nEOF\n}\n\n\n<span class=\"hljs-comment\">### kubelet should use containerd<\/span>\n{\ncat &lt;&lt;EOF | sudo tee \/etc\/<span class=\"hljs-keyword\">default<\/span>\/kubelet\nKUBELET_EXTRA_ARGS=<span class=\"hljs-string\">\"--container-runtime-endpoint unix:\/\/\/run\/containerd\/containerd.sock\"<\/span>\nEOF\n}\n\n\n\n<span class=\"hljs-comment\">### start services<\/span>\nsystemctl daemon-reload\nsystemctl enable containerd\nsystemctl restart containerd\nsystemctl enable kubelet &amp;&amp; systemctl start kubelet\n\n================================================================\nInitialize Kubernetes on Master Node\n================================================================\n<span class=\"hljs-comment\">#Finally, initialize the cluster by typing:<\/span>\n$ sudo kubeadm init --control-plane-endpoint=master-node --upload-certs<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<script src=\"https:\/\/gist.github.com\/devops-school\/d4c005bfb8815815b5e75f0e5608e41e.js\"><\/script>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[4859],"tags":[],"class_list":["post-46309","post","type-post","status-publish","format-standard","hentry","category-kubernetes"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/46309","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=46309"}],"version-history":[{"count":2,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/46309\/revisions"}],"predecessor-version":[{"id":46311,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/46309\/revisions\/46311"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=46309"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=46309"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=46309"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}