一 、Kubernetes 概述
k8s用于自动部署、扩展和管理"容器化(containerized)应用程序"的开源系统,可以理解成 K8S 是负责自动化运维管理多个容器化程序(比如 Docker)的集群,是一个生态极其丰富的容器编排框架工具。
二、K8S特性
1.弹性伸缩
使用命令、UI或者基于CPU使用情况自动快速扩容和缩容应用程序实例,
保证应用业务高峰并发时的高可用性;业务低峰时回收资源,以最小成本运行服务。
2.自我修复
在节点故障时重新启动失败的容器,替换和重新部署,保证预期的副本数量;
杀死健康检査失败的容器,并且在未准备好之前不会处理客户端请求,确保线上服务不中断。
3.服务发现和负载均衡
K8S为多个容器提供一个统一访问入口(内部IP地址和一个DNS名称),并且负载均衡关联的所有容器,
使得用户无需考虑容器IP问题。
4.自动发布(默认滚动发布模式)和回滚
K8S采用滚动更新策略更新应用,一次更新一个或者部分Pod,而不是同时删除所有Pod,
如果更新过程中出现问题,将回滚更改,确保升级不影响业务。
5.集中化配置管理和密钥管理
管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性。
并可以将一些常用的配置存储在K8S中,方便应用程序使用。
6.存储编排,支持外挂存储并对外挂存储资源进行编排
挂载外部存储系统,无论是来自本地存储,公有云(如AWS),
还是网络存储(如NFS、Glusterfs、Ceph)都作为集群资源的一部分使用,极大提高存储使用灵活性。
7.任务批处理运行
提供一次性任务,定时任务;满足批量数据处理和分析的场景。
三、Kubernetes 核心概念
Kubernetes 包含多种类型的资源对象:Pod、Label、Service、Replication 、Ingress、Controller 等。
1.pod
Pod是K8s能够创建和管理的最小单位,一个Pod里可以包含一个或者多个容器应用,Pod里的容器之间共享网络、存储等资源。
一个 Pod 里可以运行多个容器,又叫边车模式(SideCar)。
而在生产环境中一般都是单个容器或者具有强关联互补的多个容器组成一个 Pod。
同一个 Pod 之间的容器可以通过 localhost 互相访问,并且可以挂载 Pod 内所有的数据卷;
但是不同的 Pod 之间的容器不能用 localhost 访问,也不能挂载其他 Pod 的数据卷。
2.Service
在K8S集群内部,为通过标签选择器相关联的一组Pod提供一个统一的访问入口(clusterIP),只支持四层代理转发。
虚拟IP只在集群内部有效。
3.Ingress
作为K8S集群外部接入层,可自定义ingress规则根据用户请求的域名或URL请求路径转发给指定的service,支持七层代理转发。
bash
#举个例子
客户端请求 http://www.xxx.com:port ---> Ingress ---> Service ---> Pod
四、正式安装K8S-kubeadm方式
一、安装之前准备工作
安装基本软件,关闭防火墙,关闭swap
bash
apt install chrony ipvsadm tree ipset -y
systemctl stop ufw
swapoff -a
sed -i '/swap.img/s/^/#/' /etc/fstab
1.hostname修改
bash
hostnamectl set-hostname 新主机名
hostname #查看域名
2.安装容器引擎containerd
bash
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
3.安装crictl工具
下载crictl安装包:
bash
wget https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.26.1/crictl-v1.26.1-linux-amd64.tar.gz
bash
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
4.安装nerdctl工具
下载nerdctl安装包
bash
wget https://github.com/containerd/nerdctl/releases/download/v1.3.0/nerdctl-1.3.0-linux-amd64.tar.gz
bash
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
5.安装CNI工具
CNI的作用是为容器提供网桥,如果不安装CNI,容器只有host网络模式。
安装CNI:
bash
wget https://github.com/containernetworking/plugins/releases/download/v1.2.0/cni-plugins-linux-amd64-v1.2.0.tgz
tar xvf cni-plugins-linux-amd64-v1.5.1.tgz -C /opt/cni/bin/
6.测试
bash
nerdctl run -it -p 8000:80 --rm --name=nginx_test harbor.hiuiu.com/basic_image/centos7_filebeat_nginx:2408.u -- bash
nginx #在容器里启动nginx
7.配置时间服务器
bash
sed -i 's/pool ntp.ubuntu.com/pool 时间服务器地址/' /etc/chrony/chrony.conf
systemctl restart chronyd
8.加载模块
bash
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
9.修改内核参数
bash
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
10.修改machin-id
bash
cat /etc/machine-id
rm -f /etc/machine-id
systemd-machine-id-setup
二、正式安装K8S-kubeadm方式
1.安装 kubeadm 、kubelet、 kubectl
bash
## ----- 线上安装方式
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
2.拉取镜像
bash
vim imagesFromlocal.sh
nerdctl pull harbor.hiuiu.com/kubeadm_v1.30.3/kube-apiserver:v1.30.3
nerdctl pull harbor.hiuiu.com/kubeadm_v1.30.3/kube-controller-manager:v1.30.3
nerdctl pull harbor.hiuiu.com/kubeadm_v1.30.3/kube-proxy:v1.30.3
nerdctl pull harbor.hiuiu.com/kubeadm_v1.30.3/kube-scheduler:v1.30.3
nerdctl pull harbor.hiuiu.com/kubeadm_v1.30.3/pause:3.9
nerdctl pull harbor.hiuiu.com/kubernetes/etcd:3.5.12-0
nerdctl pull harbor.hiuiu.com/kubernetes/coredns:v1.11.1
bash imagesFromlocal.sh
3.创建MASTER
bash
kubeadm init --apiserver-advertise-address=172.16.205.10 --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=harbor.hiuiu.com/kubeadm_v1.30.3 --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
查看集群节点
bash
kubectl get nodes
重新生成 Kubernetes 集群节点加入命令的命令
bash
kubeadm token create --print-join-command
4.node节点加入集群
bash
kubeadm join 172.16.205.10:6443 --token tjg2ya.qxghlqugffx33rg6 \
--discovery-token-ca-cert-hash sha256:d763b517f993d0992d168db4a2650cb2fd2cca48900b99334241be86ecb825e4
清除 kubeadm 相关的配置和数据
bash
kubeadm reset
sudo rm -rf /etc/kubernetes