一、kubernetes简介
kubernetes,是一个全新的基于容器技术的分布式架构领先方案,是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本,于2014年9月发布第一个版本,2015年7月发布第一个正式版本。
kubernetes的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。目的是实现资源管理的自动化,主要提供了如下的主要功能:
自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速启动新的容器
弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整
服务发现:服务可以通过自动发现的形式找到它所依赖的服务
负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡
版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本
存储编排:可以根据容器自身的需求自动创建存储卷
Kubernetes 主要由以下几个核心组件组成:
etcd:保存了整个集群的状态;
kube-apiserver:提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制;
kube-controller-manager:负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
kube-scheduler:负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上;
kubelet:负责维持容器的生命周期,同时也负责 Volume(CVI)和网络(CNI)的管理;
Container runtime:负责镜像管理以及 Pod 和容器的真正运行(CRI),默认的容器运行时为 Docker;
kube-proxy 负责为 Service 提供 cluster 内部的服务发现和负载均衡。
二、环境准备
2.1 服务器要求
一台或多台安装linux服务器,此处使用vmware17安装虚拟服务器
硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多【注意master需要两核】,开启cpu虚拟化
需要拉取镜像,如果服务器不能上网,需要提前下载镜像并导入节点
软件 | 版本 | 备注 |
---|---|---|
操作系统 | Ubuntu-23.04 | |
kubernetes | 1.28.0 | |
docker | 25.0.2 |
角色 | IP | 备注 |
---|---|---|
k8s-master | 172.17.1.35 | master |
k8s-node-1 | 172.17.1.36 | node |
k8s-node-1 | 172.17.1.37 | node |
2.3 服务器环境准备(所有节点)
1.主机名配置
# 根据规划设置主机名【master节点上操作】
hostnamectl set-hostname k8s-master
# 根据规划设置主机名【node01节点操作】
hostnamectl set-hostname k8s-node-1
# 根据规划设置主机名【node02节点操作】
hostnamectl set-hostname k8s-node-2
2.IP配置
略,各个系统IP配置都不一样,根据自己系统配置。
3.主机名与IP解析
cat >> /etc/hosts << EOF
172.17.1.35 k8s-master
172.17.1.36 k8s-node-1
172.17.1.37 k8s-node-2
EOF
4.关闭防火墙与SELINUX
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
5.时间同步配置
apt-get install chrony -y
systemctl start chrony && systemctl enable chrony && chronyc sources
6.配置内核路由转发及网桥过滤
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1
vm.swappiness=0
EOF
sysctl --system
# 加载br_netfilter模块
modprobe br_netfilter
lsmod |grep br_netfilter
7.配置ipvs转发
apt-get -y install ipset ipvsadm
# 配置ipvsadm模块加载方式
# 添加需要加载的模块
mkdir -p /etc/sysconfig/ipvsadm
cat > /etc/sysconfig/ipvsadm/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
# 授权、运行、检查是否加载
chmod 755 /etc/sysconfig/ipvsadm/ipvs.modules && bash /etc/sysconfig/ipvsadm/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack
8.关闭swap分区
sed -ri 's/.*swap.*/#&/' /etc/fstab
swapoff -a
grep swap /etc/fstab
三、安装相关工具
安装docker、ci-dockerd、kubelet、kubeadm、kubectl(所有节点) 3.0 说明(与安装无关) (1)关于容器运行时接口(CRI)
官方文档:容器运行时 | Kubernetes
早期k8s使用docker-shim调用docker容器引擎,但docker-shim不符合CRI标准,每次k8s升级,都要重新适配,极其麻烦,Kubernetes v1.24移除docker-shim的支持,使用CRI shim。containerd是一个主流的容器引擎,内置CRI shim,与Docker相兼容,相比Docker轻量很多,目前较为成熟
配置下载源
这里用的是阿里云的源
安装kubelet kubeadm kubectl
apt-get update && apt-get install -y apt-transport-https curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb/ /" | tee /etc/apt/sources.list.d/kubernetes.list apt-get update apt-get install -y kubelet kubeadm kubectl
安装docker
# step 1: 安装必要的一些系统工具 sudo apt-get update sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common # step 2: 安装GPG证书 curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add - # Step 3: 写入软件源信息 sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" # Step 4: 更新并安装Docker-CE sudo apt-get -y update sudo apt-get -y install docker-ce # 安装指定版本的Docker-CE: # Step 1: 查找Docker-CE的版本: # apt-cache madison docker-ce # docker-ce | 17.03.1~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages # docker-ce | 17.03.0~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages # Step 2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.1~ce-0~ubuntu-xenial) # sudo apt-get -y install docker-ce=[VERSION] # 配置cgroup驱动及镜像下载加速器: cat > /etc/docker/daemon.json << EOF { "exec-opts": ["native.cgroupdriver=systemd"], "registry-mirrors": [ "https://registry.docker-cn.com", "https://docker.mirrors.ustc.edu.cn", "https://dockerhub.azk8s.cn", "http://hub-mirror.c.163.com" ] } EOF systemctl enable docker && systemctl start docker && systemctl status docker && docker info|grep systemd 3.2 安装cri-dockerd 参考:https://github.com/Mirantis/cri-dockerd # 下载安装最新版的cri-dockerd wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.8/cri-dockerd-0.3.8.amd64.tgz tar xf cri-dockerd-0.3.8.amd64.tgz mv cri-dockerd/cri-dockerd /usr/bin/ rm -rf cri-dockerd cri-dockerd-0.3.8.amd64.tgz # 配置启动项 cat > /etc/systemd/system/cri-docker.service<<EOF [Unit] Description=CRI Interface for Docker Application Container Engine Documentation=https://docs.mirantis.com After=network-online.target firewalld.service docker.service Wants=network-online.target Requires=cri-docker.socket [Service] Type=notify # ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// # 指定用作 Pod 的基础容器的容器镜像(“pause 镜像”) ExecStart=/usr/bin/cri-dockerd --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9 --container-runtime-endpoint fd:// ExecReload=/bin/kill -s HUP $MAINPID TimeoutSec=0 RestartSec=2 Restart=always StartLimitBurst=3 StartLimitInterval=60s LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity TasksMax=infinity Delegate=yes KillMode=process [Install] WantedBy=multi-user.target EOF # 说明:--pod-infra-container-image根据kubeadm config images list列出的配置镜像pause镜像配置。 cat > /etc/systemd/system/cri-docker.socket <<EOF [Unit] Description=CRI Docker Socket for the API PartOf=cri-docker.service [Socket] ListenStream=%t/cri-dockerd.sock SocketMode=0660 SocketUser=root SocketGroup=docker [Install] WantedBy=sockets.target EOF systemctl daemon-reload systemctl enable cri-docker && systemctl start cri-docker && systemctl status cri-docker
安装cri-dockerd
# 下载安装最新版的cri-dockerd wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.8/cri-dockerd-0.3.8.amd64.tgz tar xf cri-dockerd-0.3.8.amd64.tgz mv cri-dockerd/cri-dockerd /usr/bin/ rm -rf cri-dockerd cri-dockerd-0.3.8.amd64.tgz # 配置启动项 cat > /etc/systemd/system/cri-docker.service<<EOF [Unit] Description=CRI Interface for Docker Application Container Engine Documentation=https://docs.mirantis.com After=network-online.target firewalld.service docker.service Wants=network-online.target Requires=cri-docker.socket [Service] Type=notify # ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// # 指定用作 Pod 的基础容器的容器镜像(“pause 镜像”) ExecStart=/usr/bin/cri-dockerd --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9 --container-runtime-endpoint fd:// ExecReload=/bin/kill -s HUP $MAINPID TimeoutSec=0 RestartSec=2 Restart=always StartLimitBurst=3 StartLimitInterval=60s LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity TasksMax=infinity Delegate=yes KillMode=process [Install] WantedBy=multi-user.target EOF # 说明:--pod-infra-container-image根据kubeadm config images list列出的配置镜像pause镜像配置。 cat > /etc/systemd/system/cri-docker.socket <<EOF [Unit] Description=CRI Docker Socket for the API PartOf=cri-docker.service [Socket] ListenStream=%t/cri-dockerd.sock SocketMode=0660 SocketUser=root SocketGroup=docker [Install] WantedBy=sockets.target EOF systemctl daemon-reload systemctl enable cri-docker && systemctl start cri-docker && systemctl status cri-docker
# 配置 cgroup 驱动与docker一致 cp /etc/sysconfig/kubelet{,.bak} cat > /etc/sysconfig/kubelet <<EOF KUBELET_EXTRA_ARGS="--cgroup-driver=systemd" EOF systemctl enable kubelet # 安装自动补全工具(可选) apt-get install bash-completion -y source /usr/share/bash-completion/bash_completion echo "source <(kubectl completion bash)" >> ~/.bashrc source ~/.bashrc # 查看配置镜像 # 强烈建议提前pull镜像 kubeadm config images list --image-repository registry.aliyuncs.com/google_containers # 拉取配置镜像 kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers \ --cri-socket=unix:///var/run/cri-dockerd.sock
四、部署k8s master
# 初始化集群 kubeadm init \ --apiserver-advertise-address 172.17.1.35 \ --kubernetes-version v1.28.0 \ --pod-network-cidr=10.244.0.0/16 \ --image-repository registry.aliyuncs.com/google_containers \ --cri-socket=unix:///var/run/cri-dockerd.sock \ --ignore-preflight-errors=all 说明: –apiserver-advertise-address 集群通告地址,node节点连接master的地址,如果是高可用,需要配置VIP的地址。这里是单master架构,默认master地址即可。 –kubernetes-version K8s版本,与上面安装的一致 –pod-network-cidr Pod网络,与下面部署的CNI网络组件yaml中保持一致 –cri-socket 指定cri-dockerd接口,如果是containerd则使用–cri-socket unix:///run/containerd/containerd.sock 如果初始化一直超时,请检查/etc/systemd/system/cri-docker.service文件pause镜像是否与docker images的镜像一致。 # 创建配置目录 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config # 默认初始化生成token有效期是24小时,所以我们用自己的生成不过期的token,node节点加入需要用到 kubeadm token create --ttl 0 --print-join-command # 生成结果如下: kubeadm join 172.17.1.35:6443 --token pgpqgc.7wdq2kxij7thbegu --discovery-token-ca-cert-hash sha256:26b02bb33defc828b16885d15fba098febcda2bc02002196cf513530d6af6802 # 1、查看token # kubeadm token list TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS 9vtcrz.xct33esabs8zchqn 23h 2024-04-27T17:36:54Z authentication,signing The default bootstrap token generated by 'kubeadm init'. system:bootstrappers:kubeadm:default-node-token tldne2.j4wyhwy6nlyop6tk <forever> <never> authentication,signing <none> system:bootstrappers:kubeadm:default-node-token # 2、重新生成token # 默认初始化生成token有效期是24小时,所以我们用自己的生成不过期的token,node节点加入需要用到 kubeadm token create --ttl 0 --print-join-command # 3、使用已经生成的token # 查找需要的toekn # kubeadm token list # 获取公钥的hash值 openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //' # 拼接加入命令 kubeadm join 172.17.1.35:6443 --token [已经生成的token] --discovery-token-ca-cert-hash sha256:[获取到的公钥hash值] --cri-socket unix:///run/containerd/containerd.sock
五、部署k8s node
node节点操作都一样。
kubeadm join 172.17.1.35:6443 \ --token pgpqgc.7wdq2kxij7thbegu \ --discovery-token-ca-cert-hash sha256:26b02bb33defc828b16885d15fba098febcda2bc02002196cf513530d6af6802 \ --cri-socket=unix:///var/run/cri-dockerd.sock 说明:这命令在master节点使用kubeadm token create --ttl 0 --print-join-command生成的,添加节点需要指定cri-dockerd接口–cri-socket ,这里是使用cri-dockerd,如果是containerd则使用–cri-socket unix:///run/containerd/containerd.sock
六、部署容器网络(CNI)
Calico是一个纯三层的数据中心网络方案,是目前Kubernetes主流的网络方案。由于docker镜像站点被封,所以要用本地镜像。
root@master:~# tar xf calico.tar.gz root@master:~# ls calico calico.yaml images root@master:~# cd images root@master:~# cat > a.sh < EOF #!/bin/bash archive_dir="/root/calico/images" for archive in "$archive_dir"/*.tar do docker load -i "$archive" done EOF root@master:~# kubectl apply -f calico.yaml root@master:~# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-node Ready <none> 58m v1.28.10 master Ready control-plane 4d14h v1.28.10 root@master:~# kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE calico-kube-controllers-77bd7c5b-2dvx2 1/1 Running 0 30m calico-node-bncr5 1/1 Running 0 30m calico-node-zgw4t 1/1 Running 0 30m coredns-66f779496c-4cc5p 1/1 Running 1 (69m ago) 4d14h coredns-66f779496c-6qv76 1/1 Running 1 (69m ago) 4d14h etcd-master 1/1 Running 3 (69m ago) 4d14h kube-apiserver-master 1/1 Running 4 (68m ago) 4d14h kube-controller-manager-master 1/1 Running 3 (69m ago) 4d14h kube-proxy-6xl84 1/1 Running 3 (69m ago) 4d14h kube-proxy-vswx7 1/1 Running 0 58m kube-scheduler-master 1/1 Running 3 (69m ago) 4d14h