目录
一.K8s简介
Kubernetes(通常缩写为K8s)是一个开源的容器编排平台,用于自动化容器化应用的部署、扩展和管理。它最初由Google开发,现在由云原生计算基金会(CNCF)维护。Kubernetes 的核心目标是提供一个一致且可扩展的框架来管理容器化应用的生命周期。
单个容器没有价值,需要实现容器的编排功能
常见的容器编排:
-
docker-compose (单机 小型的容器编排工具)
-
网络编排
-
存储卷编排
-
-
X(推特) Mesos, Marathon ( Mesos云操作系统,只可以编排虚拟机,二次开发后Marathon 可以编排容器)
-
DC/OS
-
-
kubernetes: k8s
-
Borg --> Kubernetes
-
Kubernetes最初源于谷歌内部的Borg,Borg是谷歌内部的大规模集群管理系统,负责对谷歌内部很多核心服务的调度和管理,Borg的目的是让用户能够不必操心资源管理的问题,让他们专注于自己的核心业务,并且做到跨多个数据中心的资源利用率最大化。
Borg主要由BorgMaster、Borglet、borgcfg和Scheduler组成:
https://research.google/pubs/pub43438/ #Borg论文
谷歌在容器出现很多年前就已经在使用容器技术,只不过谷歌公司中的 工程师都是极客,不需要使用高级运行时的容器工具,所以没有在前期关注容器工具的研发,让docker这家初创公司异军突起,但是在使用容器的这么多年的中,谷歌公司从borg 系统中挑选人员,组建了 k8s 研发团队, 为了打消所有人的闭源顾虑,将k8s 捐给cncf 基金会, cncf 也属于 Linux基金会
k8s官网
https://kubernetes.io/zh/ #官网
github官网
https://github.com/kubernetes/kubernetes #github
1.Kubernetes 的关键概念
-
Pod: Kubernetes 的最小部署单元,一个 Pod 可以包含一个或多个容器,这些容器共享相同的网络和存储资源。Pod 允许容器在同一个环境中运行并相互通信。
-
Service: 用于定义和管理一组 Pod 的网络访问策略。Service 提供稳定的网络接口和负载均衡,将请求分发到其背后的 Pod。
-
Deployment: 用于声明式地管理 Pod 和 ReplicaSet 的副本。Deployment 可以自动更新、回滚和扩展应用。
-
ReplicaSet: 确保指定数量的 Pod 副本在任何时候都在运行。通常,ReplicaSet 是由 Deployment 管理的。
-
Namespace: 用于将集群资源分隔成逻辑分组,提供资源隔离、权限管理和配额控制。
-
ConfigMap 和 Secret: 用于管理配置数据和敏感信息(如密码),这些信息可以注入到容器中而无需硬编码在镜像中。
-
Volume: 提供持久存储能力,可以将数据持久化到 Pod 的生命周期之外。Kubernetes 支持多种类型的存储卷,如本地磁盘、网络存储和云存储。
-
Ingress: 管理外部 HTTP 和 HTTPS 访问到 Kubernetes 集群内部的服务。Ingress 提供了基于 URL 路径或主机名的路由功能。
-
Node: Kubernetes 集群中的一个计算节点,可以是物理服务器或虚拟机。每个 Node 上运行一个 Kubelet 进程,它负责管理该 Node 上的 Pod。
-
Cluster: 由多个 Node 组成的 Kubernetes 集群,包含一个 Master 节点(控制平面)和多个 Worker 节点(承载实际的应用和服务)。
2.Kubernetes 的功能优势
-
自动化部署和管理: Kubernetes 可以自动化应用的部署、升级、修复和回滚过程,减少手动操作。
-
负载均衡和服务发现: Kubernetes 提供内置的负载均衡和服务发现机制,确保应用的高可用性和稳定性。
-
弹性伸缩: 支持根据负载自动扩展和收缩容器实例,优化资源利用率。
-
自愈能力: 能够自动替换失败的容器,并重新调度到健康的节点上,确保应用持续运行。
-
集成和生态系统: Kubernetes 拥有一个活跃的生态系统,与许多第三方工具和服务兼容,支持各种云提供商和本地部署环境。
3.节点(Node)
Kubernetes 集群中的每个机器都被称为节点。节点可以是物理服务器或虚拟机,它们运行 Kubernetes 的组件来支持集群的功能。节点分为两种类型:
-
Master 节点(控制平面节点):
- 负责管理集群的整体状态,包括调度 Pod、管理 API 请求、协调应用部署等。
- 控制平面节点的主要组件包括:
- kube-apiserver:Kubernetes 的 API 服务器,负责处理客户端请求、验证、授权等。
- etcd:一个高可用的键值存储系统,用于存储集群的所有数据和状态信息。
- kube-scheduler:负责根据调度策略选择适当的节点来运行 Pod。
- kube-controller-manager:负责运行集群控制器,这些控制器监控集群状态并确保实际状态与期望状态一致。
- cloud-controller-manager(可选):用于与云提供商交互,管理云环境中的资源。
-
Worker 节点:
- 负责运行实际的容器化应用和服务。
- Worker 节点的主要组件包括:
- kubelet:负责确保容器运行在 Pod 中,并与 API 服务器通信,报告 Pod 状态。
- kube-proxy:负责处理网络通信和负载均衡,为服务提供网络代理功能。
- container runtime:负责实际的容器运行和管理,例如 Docker、containerd 或 CRI-O。
4.组件(Component)
Kubernetes 集群中的各个组件可以分为以下几类:
-
控制平面组件:
- kube-apiserver:提供 API 接口,处理来自用户、控制器和调度器的请求。
- etcd:存储集群状态和配置信息,保证数据的一致性和持久性。
- kube-scheduler:负责将 Pod 分配到适当的节点,基于资源需求和调度策略做决策。
- kube-controller-manager:运行不同的控制器,如 ReplicaSet 控制器、Job 控制器等,确保集群的期望状态与实际状态一致。
- cloud-controller-manager:(在使用云提供商时)管理云资源,如负载均衡器、卷等。
-
Node 组件:
- kubelet:在每个节点上运行,负责管理 Pod 和容器的生命周期,与 API 服务器沟通。
- kube-proxy:处理网络流量,支持 Service 的负载均衡和网络代理功能。
- container runtime:负责容器的启动、停止、管理和运行。
-
网络和存储组件:
- Ingress Controller:处理 HTTP 和 HTTPS 请求的路由,根据规则将流量分发到后端服务。
- Volume Plugins:支持各种存储插件,为 Pod 提供持久存储。
-
附加组件:
- Dashboard:Kubernetes 提供的 Web UI,用于可视化集群和应用的状态。
- Helm:Kubernetes 的包管理工具,用于简化应用的部署和管理。
二.Kubernetes集群架构
Kubernetes属于典型的Server-Client形式的二层架构
-
Master主要由API Server、Controller-Manager和Scheduler三个组件,以及一个用于集群状态存储的Etcd存储服务组成,它们构成整个集群的控制平面
-
而每个Node节点则主要包含Kubelet、Kube Proxy及容器运行时(docker是最为常用的实现)三个组件,它们承载运行各类应用容器
API Server
Kubernetes API server 提供了k8s各类资源对象的增删改查及watch等HTTP Rest接口 ,这些对象包括pods 、services、 replicationcontrollers等 ,API Server为REST操作提供服务 ,并为集群的共享状态提供前端 ,所有其他组件都通过该前端进行交互。
-
该端口默认值为6443 , 可通过启动参数“ -- secure-port ”的值来修改默认值。
-
默认监听IP为0.0.0.0及本机所有IP , 可以通过 启动参数“ --bind-address ”设置监听指定的 内网IP。
-
该端口用于接收客户端 、dashboard等外部 HTTPS请求。
-
实现基于Tocken文件或客户端证书及HTTP Base的认证。
-
实现基于策略的账户鉴权及准入。
-
客户端通过API Server实现对kubernetes的API 远程以实现对kubernetes内部资源的增删改查 等管理任务的分发。
-
整个集群的API网关,相关应用程序为kube-apiserver
-
基于http/https协议以REST风格提供,几乎所有功能全部抽象为“资源”及相关的“对象”
-
声明式API,用于只需要声明对象的“终态”,具体的业务逻辑由各资源相关的Controller负责完成
-
无状态,数据存储于etcd中
Cluster Store
◼ 集群状态数据存储系统,通常指的就是etcd
◼ 仅会同API Server交互
Controller Manager
◼ 负责实现客户端通过API提交的终态声明,相应应用程序为kube-controller-manager
◼ 由相关代码通过一系列步骤驱动API对象的“实际状态”接近或等同“期望状态”
◆ 工作于loop模式
Scheduler
◼ 调度器,负责为Pod挑选出(评估这一刻)最合适的运行节点
◼ 相关程序为kube-scheduler
三.安装部署环境
master: 172.16.227.11
node1: 172.16.227.12
node2: 172.16.227.13
1.初始化系统环境
ubuntu:系统环境初始化
hostnamectl hostname master
#主
hostnamectl hostname node1
#node1
hostnamectl hostname node2
#node2
2.安装容器引擎
k8s 1.23版本之前包括1.23版本使用docker作为容引擎
k8s 1.24版本之后 containerd取代了docker
containerd:
是一个开源的容器运行时工具,它为容器提供了核心功能。
OCI是一个开放标准组织,其主要目标是推动容器技术的开放标准化,以促进容器生态系统的发展和互操作性。
docker和containerd的区别和联系:
containerd取代了docker引擎,目的是提高效率。
切换主机的源为阿里源
官网
## Sources Of Ubuntu
阿里云仓库地址:https://opsx.alibaba.com/mirror https://developer.aliyun.com/mirror/
中科:http://mirrors.ustc.edu.cn/help/ubuntu.html
清华:https://mirror.tuna.tsinghua.edu.cn/help/ubuntu/
华为:https://mirrors.huaweicloud.com/
sed -i 's/https:\/\/archive.ubuntu.com/http:\/\/mirrors.cloud.aliyuncs.com/g' /etc/apt/sources.list
3. 安装containerd
apt update
apt install containerd[=版本号] -y
/lib/systemd/system/containerd.service (二进制安装参考此配置)
mkdir /etc/containerd/ ## 存放containerd的配置文件
#配置containerd
containerd config default > /etc/containerd/config.toml
修改pause镜像地址:
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9" #阿里镜像地址
sandbox_image = "harbor.hiuiu.com/kubernetes/google_containers/pause:3.9" #本地harbor镜像地址
修改镜像加速配置
168 [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
169 [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
170 endpoint = ["https://hzsbbqty.mirror.aliyuncs.com"]
修改为true
137 SystemdCgroup = true
systemctl restart containerd
4.安装crictl工具
下载crictl安装包:
wget https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.26.1/crictl-v1.26.1-linux-amd64.tar.gz
安装
mkdir /usr/local/bin/crictl
tar xvf crictl-v1.29.0-linux-amd64.tar.gz -C /usr/local/bin/crictl
vim /etc/profile
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/bin/crictl
source /etc/profile
crictl -v
#配置crictl
cat > /etc/crictl.yaml <<EOF
runtime-endpoint: "unix:///run/containerd/containerd.sock"
image-endpoint: "unix:///run/containerd/containerd.sock"
timeout: 10
debug: false
EOF
5.安装nerdctl工具
下载路径
wget https://github.com/containerd/nerdctl/releases/download/v1.3.0/nerdctl-1.3.0-linux-amd64.tar.gz
安装
tar xvf nerdctl-1.7.6-linux-amd64.tar.gz -C /usr/local/bin/
nerdctl version
mkdir /etc/nerdctl
cat > /etc/nerdctl/nerdctl.toml <<EOF
namespace = "k8s.io"
debug = false
debug_full = false
insecure_registry = true
EOF
6.CNI工具
CNI是什么?
为容器提供网桥,如果不安装CNI,容器只有host网络模式。
安装CNI:
wget https://github.com/containernetworking/plugins/releases/download/v1.2.0/cni-plugins-linux-amd64-v1.2.0.tgz
mkdir /opt/cni/bin -p
tar xvf cni-plugins-linux-amd64-v1.5.1.tgz -C /opt/cni/bin/
7.初始化K8S环境
1.安装基本的软件
apt install chrony ipvsadm tree ipset -y
2.关闭防火墙和关闭selinux
systemctl stop ufw
3.关闭swap ,交换分区
swapoff -a
sed -i '/swap.img/s/^/#/' /etc/fstab
4.配置时间服务器
为什么要配置时间服务器?
sed -i 's/pool ntp.ubuntu.com/pool 时间服务器地址/' /etc/chrony/chrony.conf
systemctl restart chronyd
5.加载模块
modprobe br_netfilter && lsmod |grep br_netfilter
modprobe ip_conntrack && lsmod | grep conntrack
cat >/etc/modules-load.d/modules.conf<<EOF
ip_vs
ip_vs_lc
ip_vs_lblc
ip_vs_lblcr
ip_vs_rr
ip_vs_wrr
ip_vs_sh
ip_vs_dh
ip_vs_fo
ip_vs_nq
ip_vs_sed
ip_vs_ftp
ip_vs_sh
ip_tables
ip_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
xt_set
br_netfilter
nf_conntrack
overlay
EOF
systemctl restart systemd-modules-load.service
lsmod | grep -e ip_vs -e nf_conntrack
6.修改内核参数
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
vm.max_map_count=262144
kernel.pid_max=4194303
fs.file-max=1000000
net.ipv4.tcp_max_tw_buckets=6000
net.netfilter.nf_conntrack_max=2097152
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness=0
sysctl -p
7.如果是克隆的需要修改machin-id
cat /etc/machine-id
rm -f /etc/machine-id
systemd-machine-id-setup
四.正式安装K8S-kubeadm
1.修改/etc/hosts
11.zxy.com 192.168.240.11 4c2G master
12.zxy.com 192.168.240.12 4c4G node1
13.zxy.com 192.168.240.13 4c4G node2
2.安装kubeadm,kubelet,kubectl
## ----- 线上同学安装方式
apt update
apt install apt-transport-https ca-certificates curl gpg
mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo 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.30/deb/ /" | tee /etc/apt/sources.list.d/kubernetes.list
## 安装命令
apt-get update && apt-cache madison kubeadm
apt-get install -y kubelet=1.30.3-1.1 kubeadm=1.30.3-1.1 kubectl=1.30.3-1.1
## ----- 线上同学安装方式
##线下同学本地安装:
apt-get update
apt-get upgrade
apt-get install socat ebtables conntrack -y
dpkg -i kubernetes-cni_1.4.0-1.1_amd64.deb
dpkg -i cri-tools_1.30.1-1.1_amd64.deb
dpkg -i kubeadm_1.30.3-1.1_amd64.deb
dpkg -i kubectl_1.30.3-1.1_amd64.deb
dpkg -i kubelet_1.30.3-1.1_amd64.deb
#线下需拉取镜像
bash imagesFromlocal.sh
3.创建MASTER(主上操作)
kubeadm init --v=5 --apiserver-advertise-address=192.168.240.11 \
--apiserver-bind-port=6443 \
--kubernetes-version=v1.30.3 \
--pod-network-cidr=10.200.0.0/16 \
--service-cidr=10.96.0.0/16 \
--service-dns-domain=cluster.local \
--image-repository=registry.aliyuncs.com/google_containers \
--ignore-preflight-errors=swap
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
4.node节点加入集群
kubeadm join 192.168.240.11:6443 --token 1vowbe.7s6vqmc2r2dc1su1 \
--discovery-token-ca-cert-hash sha256:7d1aaa5d467cbb98a1d4265c9c9f7acc9ba82a6ec027e4cbd05c70117fde8205
5.查看集群节点
kubectl get nodes
6.拉取镜像
nerdctl pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.30.3
nerdctl pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.30.3
nerdctl pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.30.3
nerdctl pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.30.3
nerdctl pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9
nerdctl pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.12-0
nerdctl pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.11.1
五.安装calico
1.主和node解压安装包
tar -zxvf calico-release-v3.28.0.tgz
2.主和node查找到calico配置文件并修改
root@master:~# cd release-v3.28.0/
root@master:~/release-v3.28.0# ls
bin images manifests
root@master:~/release-v3.28.0# cd images/
root@master:~/release-v3.28.0/images# ls
calico-cni.tar calico-dikastes.tar calico-flannel-migration-controller.tar calico-kube-controllers.tar calico-node.tar calico-pod2daemon.tar calico-typha.tar
root@master:~/release-v3.28.0/images# cd ..
root@master:~/release-v3.28.0# cd manifests/
root@master:~/release-v3.28.0/manifests# ls
alp calicoctl.yaml calico-vxlan.yaml crds.yaml generate.sh operator-crds.yaml
apiserver.yaml calico-etcd.yaml calico.yaml csi-driver.yaml grafana-dashboards.yaml README.md
calico-bpf.yaml calico-policy-only.yaml canal-etcd.yaml custom-resources.yaml ocp tigera-operator.yaml
calicoctl-etcd.yaml calico-typha.yaml canal.yaml flannel-migration ocp-tigera-operator-no-resource-loading.yaml
root@master:~/release-v3.28.0/manifests# vim calico.yaml
vim查找 /CALICO_IPV4POOL_CIDR
取消开头注释
- name: CALICO_IPV4POOL_CIDR
value: "10.200.0.0/16"
root@master:~/release-v3.28.0/manifests# cat calico.yaml | grep image:
image: docker.io/calico/cni:v3.28.0
image: docker.io/calico/cni:v3.28.0
image: docker.io/calico/node:v3.28.0
image: docker.io/calico/node:v3.28.0
image: docker.io/calico/kube-controllers:v3.28.0
root@master:~/release-v3.28.0/manifests#
3.主和node导入镜像
root@master:~/release-v3.28.0/images# nerdctl load -i calico-cni.tar
root@master:~/release-v3.28.0/images# nerdctl load -i calico-kube-controllers.tar
root@master:~/release-v3.28.0/images# nerdctl load -i calico-node.tar
4.主上执行安装
kubectl apply -f calico.yaml
5.拖入镜像查看
kubectl get nodes
kubectl run nginx11 --image=harbor.hiuiu.com/basic_image/centos7_filebeat_nginx:2408.u sleep 10000
kubectl run nginx22 --image=harbor.hiuiu.com/basic_image/centos7_filebeat_nginx:2408.u sleep 10000
kubectl get pod -o wide
kubectl exec nginx11 -it bash
添加hosts
vim /etc/hosts
10.200.104.1 nginx22
ping nginx22
kubectl exec nginx22 -it bash