前言
Kubernetes
也称为 K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统。很多朋友想要学习它,但是都卡在了集群的安装这一步,虽然网上有很多安装教程,但是有些随着k8s版本的更新已经不可用了。所以本文旨在为想学习k8s的朋友提供一个指定版本可用的安装教程,本文安装的k8s版本为1.23,底层容器为docker
版本为20.10.21。之所以没选择最新的k8s,是因为在1.24之后不再支持docker作为底层容器,而我不太喜欢用Containerd
,所以选择的1.23版本
虚拟机准备
我们这里采用Vmware来安装虚拟机,选择centos7
并且配置静态IP,网络配置参考我这篇博文:
yum配置国内镜像源
# 先下载wget net-tools vim等工具
yum install -y wget net-tools vim yum-utils
# 下载阿里镜像源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 清缓存
yum clean all
yum makecache
安装Docker
# 配置docker的下载仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装docker
yum -y install docker-ce
# 启动
systemctl start docker
# 开机启动
systemctl enable docker
# 配置docker镜像的国内下载仓库
vim /etc/docker/daemon.json
# 把下面的内容复制进去
{
"registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn"]
}
# 重启docker
service docker restart
修改Docker驱动
vim /usr/lib/systemd/system/docker.service
在ExecStart命令结尾添加 --exec-opt native.cgroupdriver=systemd 如图
关闭selinux
vi /etc/sysconfig/selinux
修改SELINUX
SELINUX=disabled
关闭swap
sed -i.bak '/swap/s/^/#/' /etc/fstab
作用就是注释掉swap那一行,相当于编辑文件/etc/fstab
开启ipv4转发:
echo 1 >/proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables
关闭防火墙
systemctl disable firewalld --now
配置k8s阿里云镜像源
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.gpgEOF
安装kubelet、kubeadm和kubectl
yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0
#设置kubelet开机自启
systemctl enable kubelet
安装K8s
我们先规划一下我们集群的ip
主机名 | ip | 系统版本 |
---|---|---|
k8s-master | 192.168.31.194 | Centos7 |
k8s-node1 | 192.168.31.195 | Centos7 |
k8s-node2 | 192.168.31.196 | Centos7 |
我们通过Vmeare的clone功能把我们上面配置好环境的虚拟机clone三份出来,然后再分别启动配置ip跟hostname
配置ip
通过 vim /etc/hostname
配置hostname
再配置一下hosts vim /etc/hosts
把本机的name解析到本机地址
node1、node2按照上面的格式分别配置下。
在master节点执行如下命令初始化master
kubeadm init --apiserver-advertise-address=192.168.31.194 --image-repository=registry.aliyuncs.com/google_containers --kubernetes-version v1.23.0 --service-cidr=10.10.10.0/24 --pod-network-cidr=10.20.20.0/24 --ignore-preflight-errors=all
apiserver-advertise-address:为master节点的ip
kubernetes-version:安装k8s版本1.23
拷贝k8s认证文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Node节点加入集群
复制初始化master节点成功后的这条命令
kubeadm join 192.168.31.194:6443 --token nqnbps.6gwy3e1df5xeipow --discovery-token-ca-cert-hash sha256:904eb5b5cccbcb0902bcaa4945961725dee6f21f1aba67f1ff5015ce11f83d16
192.168.31.194:为你master的ip
分别在两个node节点执行这个操作。
部署Calico网络
在node节点都加入成功后,我们在master节点执行 kubectl get nodes
可以看到三个节点都处于NotReady状态,是因为我们还需要部署网络。
先下载文件
wget https://docs.projectcalico.org/manifests/calico.yaml --no-check-certificate
下载完后还需要修改里面定义Pod网络(CALICO_IPV4POOL_CIDR),与之前kubeadm init的 --pod-network-cidr指定的一样
我们这里是10.20.20.0/24
默认calico.yaml中所使用的镜像都来源于docker.io国外镜像源,这里我们可以删除docker.io前缀以使镜像从国内镜像加速站点下载。
sed -i 's#docker.io/##g' calico.yaml
cat calico.yaml |grep 'image:'
修改完后文件后,进行部署:
vim canary.yaml
内容如下
#部署
kubectl apply -f calico.yaml
#查看状态,执行完上一条命令需要等一会才全部running
kubectl get pods -n kube-system
然后再执行 kubectl get nodes
,可以看到现在都处于Ready状态了
测试
我们来部署一个nginx测试一下
apiVersion: v1
kind: Namespace
metadata:
name: dev
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment-v1
namespace: dev
labels:
app: nginx-deployment-v1
spec:
replicas: 3
selector:
matchLabels: # 跟template.metadata.labels一致
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: canary-demo
namespace: dev
spec:
type: NodePort
selector: # 更Deployment中的selector一致
app: nginx
ports:
# By default and for convenience, the `targetPort` is set to the same value as the `port` field.
- port: 80
targetPort: 80
# Optional field
# By default and for convenience, the Kubernetes control plane will allocate a port from a range (default: 30000-32767)
nodePort: 30008
执行 kubectl apply -f canary.yaml
部署服务
我们会创建一个namespace dev
kubectl get nc
查看所有的namespace
我们的服务部署了3个副本
kubectl get pod -n dev
我们把我们的服务暴露到30008端口
kubectl get svc -n dev
然后我们访问三个ip的任意一个的30008端口
至此我们的Kubernetes集群就部署完成了。