前言

官方文档:Kubernetes 文档 | Kubernetes

系统装备 CentOS 7.9(2 核 2 G)

本文为 k8s 入门攻略专栏,将会运用 kubeadm 建立单节点 k8s 集群,具体讲解环境建立布置的细节,专栏后边章节会以实战代码介绍相关概念,带您快速入门 k8s

K8s 入门攻略(一):单节点集群环境建立

建立方法

k8s 集群建立有三种方法,目前干流的建立 k8s 集群的方法有 kubeadm、minikube,二进制包

kubeadm

  • 是一个东西,用于快速建立 kubernetes 集群,目前应该是比较便利和引荐的,简略易用
  • kubeadm 是 Kubernetes 1.4 开端新增的特性
  • kubeadm init 以及 kubeadm join 这两个指令能够快速创立 kubernetes 集群

minikube

  • 一般用于本地开发、测试和学习,不能用于出产环境
  • 是一个东西,minikube 快速建立一个运行在本地的单节点的 Kubernetes

二进制包

  • 在官网下载相关的组件的二进制包,上面的两个是东西,能够快速建立集群,也便是相当于用程序脚本帮咱们装好了集群,前两者属于主动布置,简化布置操作,主动布置屏蔽了很多细节,使得对各个模块感知很少,遇到问题很难排查,假如手动装置,对 kubernetes 了解也会更全面。
  • 目前出产环境的干流建立方法,已在出产环境验证,kubeadm 也能够建立出产环境,不过 kubeadm 应该还没有被大规模在出产环境验证

本次咱们作为演示的是 kubeadm

环境预备

官方文档:装置 kubeadm | Kubernetes

注:假如是运用的云服务器,下面的 swap、selinux 和防火墙都是默许封闭的,无需进行对应操作

装置 Docker

官方文档:Install Docker Engine on CentOS | Docker Docs

装置脚本如下

#!/bin/bash
set -e
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl start docker
sudo systemctl enable docker
sudo docker run hello-world

装备如下

cat > /etc/docker/daemon.json << EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF
sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker

假如在国内,能够装备镜像加速

阿里云镜像加速地址容器镜像服务镜像构建镜像授权_镜像托管-阿里云 (aliyun.com)

K8s 入门攻略(一):单节点集群环境建立

然后仿制上面地址

# 更换镜像为阿里云
vim /etc/docker/daemon.json
# 增加如下内容
{
  "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
systemctl restart docker
docker info

禁用 SELinux

将 SELinux 设置为 permissive 形式

# 将 SELinux 设置为 permissive 形式(相当于将其禁用)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

封闭 Swap

Kubernetes 1.8 开端要求封闭系统的 Swap。假如不封闭,默许装备下 kubelet 将无法发动。能够经过 kubelet 的发动参数--fail-swap-on=false更改这个限制。咱们这儿简略起见,直接封闭系统的 Swap

修正/etc/fstab文件,注释掉SWAP的主动挂载,运用free -m承认 swap 现已封闭。
swappiness参数调整,修正/etc/sysctl.d/k8s.conf 增加下面一行:

vm.swappiness=0

履行 sysctl -p /etc/sysctl.d/k8s.conf 使修正收效

封闭防火墙

假如各个主机启用了防火墙,需求开放 Kubernetes 各个组件所需求的端口

sudo systemctl stop firewalld
sudo systemctl disable firewalld

检查是否装置成功

kubeadm version
kubectl version --client
kubelet --version

其他

设置允许 iptables 检查桥接流量

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

装置相关插件

yum -y install socat conntrack-tools

集群建立

装置 kubeadm

官方文档:装置 kubeadm | Kubernetes

kubeadm:用来初始化集群的指令。

kubelet:在集群中的每个节点上用来发动 Pod 和容器等。

kubectl:用来与集群通信的指令行东西。

kubeadm 不能帮你装置或者管理 kubelet 或 kubectl,所以你需求确保它们与经过 kubeadm 装置的操控平面的版别相匹配。假如不这样做,则存在产生版别误差的风险,或许会导致一些意料之外的过错和问题。但是,操控平面与 kubelet 之间能够存在一个非必须版别的误差,但 kubelet 的版别不能够超过 API 服务器的版别。例如,1.7.0 版别的 kubelet 能够彻底兼容 1.8.0 版别的 API 服务器,反之则不能够。

履行如下脚本装置 kubeadm(国内线路)

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum install -y kubelet-1.20.2 kubeadm-1.20.2 kubectl-1.20.2 --disableexcludes=kubernetes
systemctl enable --now kubelet

装置 kubectl

curl -Lo kubectl "https://storage.googleapis.com/kubernetes-release/release/v1.20.2/bin/linux/amd64/kubectl"
chmod  x kubectl && sudo mv kubectl /usr/local/bin/

拉取镜像

履行 kubeadm config images pull 拉取镜像,但是很大或许由于网络原因衔接失利,能够运用如下阿里云指令(版别 v1.21)

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.21.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.21.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.21.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.21.1
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.13-0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2
docker pull coredns/coredns:1.7.0

在 k8s 装置时会默许在镜像中获取 k8s.gcr.io 前缀的镜像,所以咱们需求将上文下载好的镜像更改名称

docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.21.1 k8s.gcr.io/kube-apiserver:v1.21.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.21.1 k8s.gcr.io/kube-proxy:v1.21.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.21.1 k8s.gcr.io/kube-controller-manager:v1.21.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.21.1 k8s.gcr.io/kube-scheduler:v1.21.1
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.13-0 k8s.gcr.io/etcd:3.4.13-0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2
docker tag coredns/coredns:1.7.0 k8s.gcr.io/coredns:1.7.0

注:后边 kubeadm init初始集群的时候或许报错,显现镜像版别不对应,自行更改上面的版别即可,重新 docker pulldocker tag 即可,集体替换版别即可(1.21.1 -> 1.20.15),我这儿便是偶然需求用 1.21.1 版别,偶然需求用 1.20.15 版别,所以我索性给这两个版别镜像都拉取到本地

修正主机映射

vim /etc/hosts

K8s 入门攻略(一):单节点集群环境建立

初始化服务

在初始化集群之前需求先重启下 kubelet systemctl restart kubelet

kubeadm init --apiserver-advertise-address=172.25.234.148 --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.21.1
# 或
kubeadm init

解说下指令

  1. kubeadm init: 这是指令的主体部分,它告诉 kubeadm 初始化一个新的 Kubernetes 操控平面。
  2. --apiserver-advertise-address=192.168.44.15: 这个选项指定 Kubernetes API Server 监听的网络地址。在这儿,它设置为 192.168.44.15
  3. --pod-network-cidr=10.244.0.0/16: 这个选项指定用于 Pod 网络的 CIDR 地址规模。这是容器之间通信的地址规模。在这儿,它设置为 10.244.0.0/16
  4. --kubernetes-version=v1.21.1: 这个选项指定要装置的 Kubernetes 版别,这儿设置为 v1.21.1

假如呈现问题,需求自行检查日志然后查找解决(由于或许的呈现过错太多,这儿无法逐个列出)

K8s 入门攻略(一):单节点集群环境建立

能够尝试重新发动 kubelet systemctl restart kubelet ,然后重置集群kubeadm reset,然后再次尝试初始化

K8s 入门攻略(一):单节点集群环境建立

注意:这儿我运用的是 kubeadm init 初始化集群

下面解说成功日志输出,要使非 root 用户能够运行 kubectl,请运行以下指令,它们也是 kubeadm init 输出的一部分

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

假如是 root 用户,能够运行如下

export KUBECONFIG=/etc/kubernetes/admin.conf

咱们能够运行 kubectl apply -f [podnetwork].yaml 布置 Pod 网络

然后假如多集群布置,而且多服务器之间内网是连通的话,能够运用如下指令增加工作节点

kubeadm join 172.25.234.148:6443 --token ls55pz.ed4wq51xex0ho1hh 
    --discovery-token-ca-cert-hash sha256:a082bb7e27b8c26625edeb8198e49967bd4dd4493b3b532c750a9f98f912f801

然后咱们能够装置 Flannel,Flannel 经过给每台宿主机分配一个子网的方法为容器提供虚拟网络,它根据 Linux TUN/TAP,运用 UDP 封装 IP 包来创立 overlay 网络,并凭借 etcd 保护网络的分配情况

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

最后验证节点,假如为 Ready 则 master 节点现已注册到了 k8s

kubectl get nodes

假如是 NotReady,能够履行以下句子判别服务器状态

K8s 入门攻略(一):单节点集群环境建立

kubectl get nodes -o yaml

然后检查 kubelet 日志 journalctl -f -u kubelet.service

部分日志显现过错:networkPlugin cni failed to set up pod

vim /etc/yum.repos.d/kubernetes.repo
gpgcheck=0
repo_gpgcheck=0
# 上面两项修正如下
gpgcheck=1
repo_gpgcheck=1
# 然后履行如下
yum clean all
yum install kubernetes-cni -y

最后能够看到节点增加成功

K8s 入门攻略(一):单节点集群环境建立

总结

至此单节点环境布置现已结束,博主刚刚触摸学习 k8s,希望和大家共享学习中的经验教训,假如文中有过错疏忽还望各位指出

后边专栏大概还会有一到两个章节,以实战 demo 代码学习 Pod,Deployment,Service 等概念

除此之外的话,我自己也尝试过 windows(WSL2)建立 minikube k8s 环境,不是很理想,哪怕是对于学习意图也并不引荐。然后其实相较于 CentOS 其实官方更引荐运用 Ubuntu ,官方社区长期保护,也比较稳定

参考链接

本文由博客一文多发渠道 OpenWrite 发布!