Kubeadmin来快速搭建一个k8s集群:
二进制搭建适合大集群,50台以上的主机,
但是kubeadm更适合中小企业的业务集群
Master:20.0.0.71 2核4G 或者4核8G docker kubelet kubectl flannel
Node1:20.0.0.72 2核4G 或者4核8G docker kubelet kubectl flannel
Node2: 20.0.0.73 2核4G docker kubelet kubectl flannel
Harbor节点:20.0.0.74 2核4Gdocker-compose harbor
所有节点
systemctl stop firewalld
setenforce 0
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
swapoff -a
所有节点
for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^.*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done
改主机名
master1:
hostnamectl set-hostname master01
node1:
hostnamectl set-hostname node01
node2:
hostnamectl set-hostname node02
映射
做内核优化:
vim /etc/sysctl.d/k8s.conf
#开启网桥模式:
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
#网桥的流量传给iptables链,实现地址映射
#关闭ipv6的流量(可选项)
net.ipv6.conf.all.disable_ipv6=1
#根据工作中的实际情况,自定
net.ipv4.ip_forward=1
wq!
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
##
sysctl --system
时间同步(全部)
yum install ntpdate -y
ntpdate ntp.aliyun.com
date
所有节点安装docker
###
资源控制器必须systemd(三台)
mkdir /etc/docker
cat > /etc/docker/daemon.json < { "registry-mirrors": ["https://pkm63jfy.mirror.aliyuncs.com"], "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" } } EOF systemctl daemon-reload systemctl restart docker.service systemctl enable docker.service docker info | grep "Cgroup Driver" Cgroup Driver: systemd 安装kuberctl(三台) //定义kubernetes源 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.gpg EOF yum install -y kubelet-1.20.15 kubeadm-1.20.15 kubectl-1.20.15 //查看初始化需要的镜像 kubeadm config images list --kubernetes-version 1.20.15 k8s.gcr.io/kube-apiserver:v1.20.15 k8s.gcr.io/kube-controller-manager:v1.20.15 k8s.gcr.io/kube-scheduler:v1.20.15 k8s.gcr.io/kube-proxy:v1.20.15 k8s.gcr.io/pause:3.2 k8s.gcr.io/etcd:3.4.13-0 k8s.gcr.io/coredns:1.7.0 取消同步操作 主节点操作: //查看初始化需要的镜像 kubeadm config images list --kubernetes-version 1.20.15 解析: Pause:特殊的pod Pause会在节点上创建一个网络命名空间,其他容器可以加入这个网络命名空间 Pod里面的容器可能使用不同的代码架构编写,可以在一个网络空间里面实现通信,协调这个命名空间里面的资源(实现pod内容器的兼容性) Kubeadm安装的k8s都是以pod的形式运行在kube-system这个空间当中 Kubeletnode管理器可以进行系统控制 kubeadm init \ --apiserver-advertise-address=20.0.0.71 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version=v1.20.15 \ --service-cidr=10.96.0.0/16 \ --pod-network-cidr=10.244.0.0/16 \ --token-ttl=0 第二行:声明master节点的apiserver法人监听地址 第三行:声明拉取镜像的仓库,使用阿里云 第四行:k8s的版本号 第五行:所有server的对外代理地址都是10.96.0.0/16 第六行:所有pod的IP地址的网段 第七行:默认的token的有效期,默认是24小时,0表示永不过期 将黑色代码,复制到两个node节点,node1,node2执行 mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config systemctl restart kubelet 初始化后需要修改 kube-proxy 的 configmap,开启 ipvs kubectl edit cm kube-proxy -n=kube-system 修改mode: ipvs Systemctl restart kublet kubectl get nodes kubectl get cs发现集群不健康,更改以下两个文件 修改监听地址 vim /etc/kubernetes/manifests/kube-scheduler.yaml vim /etc/kubernetes/manifests/kube-controller-manager.yaml systemctl restart kubelet kubectl get pods -n kube-system 部署网络(三台) //所有节点上传 flannel 镜像 flannel.tar 和网络插件 cni-plugins-linux-amd64-v0.8.6.tgz 到 /opt 目录, master节点上传 kube-flannel.yml 文件 cd /opt docker load < flannel.tar mv /opt/cni /opt/cni_bak mkdir -p /opt/cni/bin tar zxvf cni-plugins-linux-amd64-v0.8.6.tgz -C /opt/cni/bin 主节点: //在 master 节点创建 flannel 资源 kubectl apply -f kube-flannel.yml kubectl get node 删除节点: kubectl delete node master01 kubectl get pod -n kube-system 证书有效期 #证书有效期的问题,kubeadm默认只有1年: openssl x509 -in /etc/kubernetes/pki/ca.crt -noout -text | grep Not openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep Not chmod 777 update-kubeadm-cert.sh all ./update-kubeadm-cert.sh all 看有效期 运行脚本改日期 赋权,然后运行脚本 //在master节点查看节点状态 kubectl get nodes kubectl get pods -n kube-system 添加自动补齐 集群已经搭建完毕 验证 创建镜像 kubectl create deployment nginx --image=nginx --replicas=3 kubectl get pods kubectl describe pod pod后面加name,可以查看状态 做个server kubectl get svc Curl +ip :31038 搭建仓库: Test4: //上传 harbor-offline-installer-v2.8.1.tgz 和 docker-compose 文件到 /opt 目录 cd /opt cp docker-compose /usr/local/bin/ chmod +x /usr/local/bin/docker-compose tar zxvf harbor-offline-installer-v2.8.1.tgz cd harbor/ vim harbor.yml 安装 部署与k8s集群对接的Harbor仓库 //上传 harbor-offline-installer-v2.8.1.tgz 和 docker-compose 文件到 /opt 目录 cd /opt cp docker-compose /usr/local/bin/ chmod +x /usr/local/bin/docker-compose tar zxvf harbor-offline-installer-v2.8.1.tgz cd harbor/ vim harbor.yml hostname = hub.test.com https: # https port for harbor, default is 443 port: 443 # The path of cert and key files for nginx certificate: /data/cert/server.crt private_key: /data/cert/server.key harbor_admin_password = 123456 //生成证书 mkdir -p /data/cert cd /data/cert #生成私钥 openssl genrsa -des3 -out server.key 2048 输入两遍密码:123456 openssl genrsa: 用于生成 RSA 密钥。 -des3: 使用 Triple DES 加密算法对生成的私钥进行加密。 -out server.key: 指定生成的私钥文件的名称为 server.key。 2048: 指定 RSA 密钥的位数为 2048 位。 #生成证书签名请求文件 openssl req -new -key server.key -out server.csr 输入私钥密码:123456 输入国家名:CN 输入省名:BJ 输入市名:BJ 输入组织名:TEST 输入机构名:TEST 输入域名:hub.kgc.com 输入管理员邮箱:[email protected] 其它全部直接回车 #备份私钥 cp server.key server.key.org #清除私钥密码 openssl rsa -in server.key.org -out server.key 输入私钥密码:123456 #签名证书 openssl x509 -req -days 1000 -in server.csr -signkey server.key -out server.crt chmod +x /data/cert/* cd /opt/harbor/ ./prepare ./install.sh 在本地使用火狐浏览器访问:https://20.0.0.74 添加例外 -> 确认安全例外 用户名:admin 密码:123456 Node2 mkdir -p /etc/docker/certs.d/hub.test.com/ Harbor操作 scp -r data/ [email protected]:/ 映射 vim /lib/systemd/system/docker.service ##修改 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry=hub.test.com systemctl daemon-reload systemctl restart docker 登录 docker login -u admin -p 123456 https://hub.test.com 测试是否成功 docker pull nginx docker tag nginx:latest hub.test.com/library/nginx:v1 docker push hub.test.com/library/nginx:v1 Node3也是同样的操作 mkdir -p /etc/docker/certs.d/hub.test.com/ scp -r data/ [email protected]:/ mkdir -p /etc/docker/certs.d/hub.test.com/ cd /data/cert/ cp server.crt server.csr server.key /etc/docker/certs.d/hub.test.com/ cd /etc/docker/certs.d/hub.test.com/ vim /etc/hosts vim /lib/systemd/system/docker.service #添加 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry=hub.test.com systemctl daemon-reload systemctl restart docker docker login -u admin -p 123456 https://hub.test.com 演示从仓库拉取镜像 kubectl create deployment nginx --image=hub.test.com/library/nginx:v1 --replicas=3 拉取失败 kubectl get pods 把harbor权限改为公开 即可成功 基于deployments,创建的无法通过delete删除,必须要先删除deployments.apps,如上图所示 绑定到集群,#获取token值 创建用户,获取token 浏览器登录