前言
官方文档:Kubernetes 文档 | Kubernetes
系统装备 CentOS 7.9(2 核 2 G)
本文为 k8s
入门攻略专栏,将会运用 kubeadm 建立单节点 k8s 集群,具体讲解环境建立布置的细节,专栏后边章节会以实战代码介绍相关概念,带您快速入门 k8s
建立方法
k8s
集群建立有三种方法,目前干流的建立 k8s
集群的方法有 kubeadm、minikube,二进制包
kubeadm
- 是一个东西,用于快速建立 kubernetes 集群,目前应该是比较便利和引荐的,简略易用
- kubeadm 是 Kubernetes 1.4 开端新增的特性
- kubeadm init 以及 kubeadm join 这两个指令能够快速创立 kubernetes 集群
minikube
- 一般用于本地开发、测试和学习,不能用于出产环境
- 是一个东西,minikube 快速建立一个运行在本地的单节点的 Kubernetes
二进制包
- 在官网下载相关的组件的二进制包,上面的两个是东西,能够快速建立集群,也便是相当于用程序脚本帮咱们装好了集群,前两者属于主动布置,简化布置操作,主动布置屏蔽了很多细节,使得对各个模块感知很少,遇到问题很难排查,假如手动装置,对 kubernetes 了解也会更全面。
- 目前出产环境的干流建立方法,已在出产环境验证,kubeadm 也能够建立出产环境,不过 kubeadm 应该还没有被大规模在出产环境验证
本次咱们作为演示的是 kubeadm
环境预备
注:假如是运用的云服务器,下面的 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)
然后仿制上面地址
# 更换镜像为阿里云
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:用来初始化集群的指令。
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 pull
和docker tag
即可,集体替换版别即可(1.21.1 -> 1.20.15),我这儿便是偶然需求用 1.21.1 版别,偶然需求用 1.20.15 版别,所以我索性给这两个版别镜像都拉取到本地
修正主机映射
vim /etc/hosts
初始化服务
在初始化集群之前需求先重启下 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
解说下指令
-
kubeadm init
: 这是指令的主体部分,它告诉kubeadm
初始化一个新的 Kubernetes 操控平面。 -
--apiserver-advertise-address=192.168.44.15
: 这个选项指定 Kubernetes API Server 监听的网络地址。在这儿,它设置为192.168.44.15
。 -
--pod-network-cidr=10.244.0.0/16
: 这个选项指定用于 Pod 网络的 CIDR 地址规模。这是容器之间通信的地址规模。在这儿,它设置为10.244.0.0/16
。 -
--kubernetes-version=v1.21.1
: 这个选项指定要装置的 Kubernetes 版别,这儿设置为v1.21.1
。
假如呈现问题,需求自行检查日志然后查找解决(由于或许的呈现过错太多,这儿无法逐个列出)
能够尝试重新发动 kubelet systemctl restart kubelet
,然后重置集群kubeadm reset
,然后再次尝试初始化
注意:这儿我运用的是
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,能够履行以下句子判别服务器状态
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
,希望和大家共享学习中的经验教训,假如文中有过错疏忽还望各位指出
后边专栏大概还会有一到两个章节,以实战 demo 代码学习 Pod,Deployment,Service 等概念
除此之外的话,我自己也尝试过 windows(WSL2)建立 minikube k8s
环境,不是很理想,哪怕是对于学习意图也并不引荐。然后其实相较于 CentOS 其实官方更引荐运用 Ubuntu ,官方社区长期保护,也比较稳定
参考链接
- 经过 kubeadm 建立单节点 k8s 环境 | yanyx’s blog
- 用 Kubeadm 建立一个 k8s 1.7.5 的单节点集群
- 运用 kubeadm 建立 kubernetes 单机 master – 阿里云开发者社区
- guangzhengli/k8s-tutorials: k8s tutorials | k8s 教程
本文由博客一文多发渠道 OpenWrite 发布!