前言

Kubernetes 也称为 K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统。很多朋友想要学习它,但是都卡在了集群的安装这一步,虽然网上有很多安装教程,但是有些随着k8s版本的更新已经不可用了。所以本文旨在为想学习k8s的朋友提供一个指定版本可用的安装教程,本文安装的k8s版本为1.23,底层容器为docker版本为20.10.21。之所以没选择最新的k8s,是因为在1.24之后不再支持docker作为底层容器,而我不太喜欢用Containerd,所以选择的1.23版本

虚拟机准备

我们这里采用Vmware来安装虚拟机,选择centos7

Centos7镜像下载地址

并且配置静态IP,网络配置参考我这篇博文:

基于Vmware安装的Linux配置静态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集群就部署完成了。