k8s简述和搭建集群
k8s是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、自维护等功能。官网:https://kubernetes.io。
目录
3. 禁用 firewall 和 swap,关闭selinux
1. 安装三大组件-kubeadm、kubelet、kubectl
一、介绍
k8s是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、自维护等功能。
二、架构
1. master(管理节点)
1.1 功能
-- 提供对集群的控制
-- 对集群进行全局决策
-- 检测和响应集群事件
1.2 节点核心组件
-- API Server 对外接口,被客户端,组件调用,负责处理接受请求
-- Scheduler 对集群内部分配和调度
-- ControllerManager 管理控制器,相当于"大总管",负责运行不同类型的控制器进程,每个控制器都是一个单独进程
-- etcd 键值数据库,基于go语言,后端元数据存储etcd中,kubernetes在运行过程中产生的元数据全部存储在etcd中
2. node (计算节点)
2.1 功能
-- 运行容器的实际节点
-- 提供运行环境
-- 在多个节点上运行
-- 水平扩产
2.2 核心组件
-- kubelet (接收apiserver的指令)监视Pod,包括创建,修改,删除,每个Node节点上都会运行一个kubelet,不会管理不是由 Kubernetes 创建的容器
-- kube-proxy 为Pod对象提供网络代理;实现service的通信和负载均衡
-- Runtime 容器管理,负责管理容器的执行和生命周期。支持多种类型的容器运行时环境
3. image (镜像仓库)
3.1 功能
-- 存储镜像
-- 为节点提供镜像支持
3.2 仓库类型
-- Registry
-- Harbor
三、部署概述
1. k8s官网
官网:https://kubernetes.io
2. 部署环境要求:
-- 内核版本 >= 3,10
-- 最低配置 2cpu,2G内存
-- 节点之中不可以有重复的主机名、MAC地址或product_uuid,网络互通
-- 禁用防火墙
-- 禁用swap
主机名 | IP地址 | 最低配置 |
master | 192.168.1.50 | 2CPU,4G内存 |
node01 | 192.168.1.51 | 2CPU,4G内存 |
node02 | 192.168.1.52 | 2CPU,4G内存 |
四、环境配置
1. 修改hosts配置
[root@master ~]# vim /etc/hosts
192.168.1.50 master
192.168.1.51 node01
192.168.1.52 node02
2. 配置SSH免密登录
先生成公钥对,再把公钥远程复制到所有节点
[root@master ~]# ssh-keygen
[root@master ~]# ssh-copy-id master
[root@master ~]# ssh-copy-id node01
[root@master ~]# ssh-copy-id node02
3. 禁用 firewall 和 swap,关闭selinux
# 禁用swap
[root@master ~]# sed -i '/swap/s/^/#/' /etc/fstab # 永久禁用swap重启后生效
[root@master ~]# swapoff -a # 临时关闭,重启恢复
# 禁用防火墙
[root@master ~]# systemctl stop firewalld
[root@master ~]# systemctl disabled firewalld
# 关闭selinux
[root@master ~]# setenforce 0
[root@master ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config #重启后生效
4. 时间同步
执行命令前 可以 使用 rpm -qa |grep chrony 查看系统是否已安装chrony,没有安装环境可使用 yum install chrony 命令安装
#启动chronyd服务
[root@master ~]# systemctl start chronyd
[root@master ~]# systemctl enable chronyd
[root@master ~]# date
5. 修改内核参数
[root@master ~]# cat > /etc/modules-load.d/containerd.conf << EOF
> overlay # overlay文件系统模块
> br_netfilter # 网桥防火墙模块
> xt_conntrack # 链接跟踪表模块
> EOF
[root@master ~]# systemctl start systemd-modules-load.service
6. 添加网桥过滤和地址转发功能
[root@master ~]# cat > /etc/sysctl.d/99-kubernetes-cri.conf << EOF
> net.ipv4.ip_forward = 1 # 开启路由转发
> net.bridge.bridge-nf-call-iptables = 1 # 开启桥流量监控
> net.bridge.bridge-nf-call-ip6tables = 1 # 开启桥流量监控
> net.netfilter.nf_conntrack_max = 1000000 # 设置链接跟踪表大小
> EOF
[root@master ~]# sysctl -p /etc/sysctl.d/99-kubernetes-cri.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.netfilter.nf_conntrack_max = 1000000
7. tc命令
# 安装tc命令
[root@master home]# yum install -y iproute
8. 配置k8s的yum源
[root@master ~]# vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
五、安装docker
1. 安装docker依赖
[root@master ~]# yum install -y yum-utils
2. 配置yum源
[root@master ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3. 安装启动docker
[root@master ~]# yum install docker-ce docker-ce-cli containerd.io
[root@master ~]# systemctl enable docker && systemctl start docker
# 配置docker 镜像加速器
[root@master ~]# > cat <<EOF> /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"]
}
EOF
# 重启docker
[root@master ~]# systemctl restart docker
六、安装k8s
1. 安装三大组件-kubeadm、kubelet、kubectl
- kubeadm:用来初始化k8s集群的指令。
- kubelet:在集群的每个节点上用来启动 Pod 和容器等。
- kubectl:用来与k8s集群通信的命令行工具,查看、创建、更新和删除各种资源。
# 所有节点都安装
[root@master home]# yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9
# 配置kubelet的cgroup
[root@master home]# vim /etc/sysconfig/kubelet
#添加下面的配置
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs
# 所有节点设置开机启动
[root@master home]# systemctl enable kubelet --now
2. 初始化k8s集群
- apiserver-advertise-address:apiserver监听地址
- control-plane-endpoint:控制平面的IP地址或DNS名称
- image-repository:镜像仓库,此处为国内阿里云镜像仓库加速下载
- service-cidr:为Service分配的IP地址段
- pod-network-cidr:为pod分配的IP地址段
# 只在主节点执行
kubeadm init \
--apiserver-advertise-address=192.168.31.200 \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=172.20.0.0/16 \
--apiserver-advertise-address=$(hostname -I | awk '{print $1}')
初始化需要下载多个镜像,可能时间比较久,最终安装的镜像如下
[root@master ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy v1.20.9 8dbf9a6aa186 2 years ago 99.7MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager v1.20.9 eb07fd4ad3b4 2 years ago 116MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver v1.20.9 0d0d57e4f64c 2 years ago 122MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler v1.20.9 295014c114b3 2 years ago 47.3MB
registry.cn-hangzhou.aliyuncs.com/google_containers/etcd 3.4.13-0 0369cf4303ff 3 years ago 253MB
registry.cn-hangzhou.aliyuncs.com/google_containers/coredns 1.7.0 bfe3a36ebd25 3 years ago 45.2MB
registry.cn-hangzhou.aliyuncs.com/google_containers/pause 3.2 80d28bedfe5d 3 years ago 683kB
成功界面:
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 上面三行赋予权限,就是初始化master节点
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.5.10:6443 --token kdy4ka.jz5otwd1l3l2of5v \
--discovery-token-ca-cert-hash sha256:d40fe1c0af2bef8143106d27d418a4b7026f1f79a6dfe30cb4691d35755719ad
# 上面三行是使计算节点加入master节点
要使非root用户运行kubectl,请执行以下命令,这也是上面kubeadm init输出的一部分:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
3. 加入节点
kubeadm join 192.168.5.10:6443 --token kdy4ka.jz5otwd1l3l2of5v \
--discovery-token-ca-cert-hash sha256:d40fe1c0af2bef8143106d27d418a4b7026f1f79a6dfe30cb4691d35755719ad
查看token列表,可观察到每个token的剩余有效时间
[root@master ~]# kubeadm token list
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
kdy4ka.jz5otwd1l3l2of5v 7h 2023-10-03T19:46:32+08:00 authentication,signing The default bootstrap token generated by 'kubeadm init'. system:bootstrappers:kubeadm:default-node-token
默认token有效期为24小时,过期之后token失效,可重新生成token:
[root@master ~]# kubeadm token create --ttl=0 --print-join-command
查看node
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane 20h v1.26.0
node1 Ready <none> 27s v1.26.0
4. 安装网络插件 calico
在虚拟化平台中,比如 OpenStack、Docker 等都需要实现workloads之间互连,但同时也需要对容器做了隔离控制,设置访问策略,calico就可以解决以上所有问题,calico可以让不同节点上的容器实现互联互通,同时可以设置访问策略,它是一个容器之间网络互通的解决方案。
简单来说,实现不同节点上的Pod网络互通。
# 下载calico.yaml并保存到本地
[root@master ~]# curl https://docs.projectcalico.org/v3.15/manifests/calico.yaml -O
修改配置
3888行 - name: CALICO_IPV4POOL_CIDR
3889行 value: "172.20.0.0/16"
# 提交
[root@node1 ~]# kubectl apply -f calico.yaml
# 验证是否成功
[root@node1 ~]# kubectl get pod -A | grep calico
kube-system calico-kube-controllers-577f77cb5c-s6zfl 1/1 Running 0 15h
kube-system calico-node-7gsfr 1/1 Running 0 15h
kube-system calico-node-hb2k8 1/1 Running 0 15h
kube-system calico-node-xt4bl 1/1 Running 0 15h
5. TAB设置快捷键
自动补全设置,kubectl、kubeadm支持自动补全功能,可以节省大量输入,自动补全脚本由kubectl、kubeadm产生,仅需要在您的shell配置文件中调用即可
[root@master ~]# source <(kubeadm completion bash|tee /etc/bash_completion.d/kubeadm)
[root@master ~]# source <(kubeadm completion bash|tee /etc/bash_completion.d/kubeadm)
七、验证集群状态
# 验证节点工作状态
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane 22h v1.26.0
node1 Ready <none> 106m v1.26.0
node2 Ready <none> 97m v1.26.0
# 验证容器工作状态
[root@master ~]# kubectl -n kube-system get pods
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-fc945b5f7-qr8j4 1/1 Running 1 (147m ago) 21h
calico-node-9g7n9 1/1 Running 0 36m
calico-node-bwrbx 1/1 Running 0 101m
calico-node-gnwjs 1/1 Running 0 110m
calico-node-qp8nt 1/1 Running 0 53m
calico-node-rd4fw 1/1 Running 1 (147m ago) 21h
calico-node-z7cgz 1/1 Running 0 21m
coredns-844c6bb88b-749tp 1/1 Running 1 (147m ago) 22h
coredns-844c6bb88b-wk4r8 1/1 Running 1 (147m ago) 22h
etcd-master 1/1 Running 1 (147m ago) 22h
kube-apiserver-master 1/1 Running 1 (147m ago) 22h
kube-controller-manager-master 1/1 Running 1 (147m ago) 22h
kube-proxy-9fswd 1/1 Running 0 53m
kube-proxy-grqsh 1/1 Running 0 36m
kube-proxy-gsbvj 1/1 Running 0 101m
kube-proxy-hfbqq 1/1 Running 1 (147m ago) 22h
kube-proxy-xgj4w 1/1 Running 0 110m
kube-proxy-zz5cv 1/1 Running 0 21m
kube-scheduler-master 1/1 Running 1 (147m ago) 22h
更多推荐
所有评论(0)