Kubernetes集群(三)
一、生产环境下的k8s集群搭建
官方网址:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
上图是官网的对环境要求,之前我在docker的文章中有写过用Vagrantfile文件创建虚拟机,接下来,我还是用这种方式创建一主两从的虚拟机环境出来
1.1、Vagrantfile文件
boxes = [ { :name => "master-kubeadm-k8s", :eth1 => "192.168.0.105", :mem => "2048", :cpu => "2" }, { :name => "worker01-kubeadm-k8s", :eth1 => "192.168.0.106", :mem => "2048", :cpu => "2" }, { :name => "worker02-kubeadm-k8s", :eth1 => "192.168.0.107", :mem => "2048", :cpu => "2" } ] Vagrant.configure(2) do |config| config.vm.box = "centos/7" boxes.each do |opts| config.vm.define opts[:name] do |config| config.vm.hostname = opts[:name] config.vm.provider "vmware_fusion" do |v| v.vmx["memsize"] = opts[:mem] v.vmx["numvcpus"] = opts[:cpu] end config.vm.provider "virtualbox" do |v| v.customize ["modifyvm", :id, "--memory", opts[:mem]] v.customize ["modifyvm", :id, "--cpus", opts[:cpu]] v.customize ["modifyvm", :id, "--name", opts[:name]] end config.vm.network :public_network, ip: opts[:eth1] end end end
1.2、创建虚拟机
然后在文件夹目录执行如下命令就可以看到三台虚拟机的构造过程,最后可以得到一主两从的k8s集群(如果不很理解这过程的去看下我写的docker文章)
1.3、更新并安装依赖
3台机器都需要执行
yum -y update
yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp
1.4、安装docker
在每一台机器上都安装好Docker,版本为18.09.0
01 安装必要的依赖
sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2
02 设置docker仓库
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
【设置要设置一下阿里云镜像加速器】
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["这边替换成自己的实际地址"] } EOF
sudo systemctl daemon-reload
03 安装docker
yum install -y docker-ce-18.09.0 docker-ce-cli-18.09.0 containerd.io
04 启动docker
sudo systemctl start docker && sudo systemctl enable docker
1.5 修改hosts文件
(1)master
设置master的hostname,并且修改hosts文件
sudo hostnamectl set-hostname m
vi /etc/hosts
192.168.0.105 m 192.168.0.106 w1 192.168.0.107 w2
(2)两个worker
设置worker01/02的hostname,分别设置w1和w2,并且修改hosts文件
sudo hostnamectl set-hostname w1 sudo hostnamectl set-hostname w2
vi /etc/hosts
192.168.0.105 m 192.168.0.106 w1 192.168.0.107 w2
(3)使用ping测试一下,我是能ping通的
1.6 系统基础前提配置(三台者执行)
(1)关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
(2)关闭selinux
setenforce 0 sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
(3)关闭swap
swapoff -a sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab
(4)配置iptables的ACCEPT规则
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT
(5)设置系统参数
cat <<EOF > /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl --system
1.7 Installing kubeadm, kubelet and kubectl(三台都执行)
(1)配置yum源(我用了阿里的进行了替换,可以参照官网命令看区别)
cat <<EOF > /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 http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF
(2)安装kubeadm&kubelet&kubectl
yum install -y kubeadm-1.14.0-0 kubelet-1.14.0-0 kubectl-1.14.0-0
(3)docker和k8s设置同一个cgroup
vi /etc/docker/daemon.json
添加上下面一句话
"exec-opts": ["native.cgroupdriver=systemd"],
然后重启
systemctl restart docker
kubelet,这边如果发现输出directory not exist,也说明是没问题的,大家继续往下进行即可
sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
重启kubelet
systemctl enable kubelet && systemctl start kubelet
1.8 proxy/pause/scheduler等国内镜像(三台操作)
(1)查看kubeadm使用的镜像
kubeadm config images list
可以发现这里都是国外的镜像
(2)解决国外镜像不能访问的问题
创建kubeadm.sh脚本,用于拉取镜像/打tag/删除原有镜像
vi kubeadm.sh
然后把下面贴进去
#!/bin/bash set -e KUBE_VERSION=v1.14.0 KUBE_PAUSE_VERSION=3.1 ETCD_VERSION=3.3.10 CORE_DNS_VERSION=1.3.1 GCR_URL=k8s.gcr.io ALIYUN_URL=registry.cn-hangzhou.aliyuncs.com/google_containers images=(kube-proxy:${KUBE_VERSION} kube-scheduler:${KUBE_VERSION} kube-controller-manager:${KUBE_VERSION} kube-apiserver:${KUBE_VERSION} pause:${KUBE_PAUSE_VERSION} etcd:${ETCD_VERSION} coredns:${CORE_DNS_VERSION}) for imageName in ${images[@]} ; do docker pull $ALIYUN_URL/$imageName docker tag $ALIYUN_URL/$imageName $GCR_URL/$imageName docker rmi $ALIYUN_URL/$imageName done
运行脚本和查看镜像
sh ./kubeadm.sh
查看镜像
docker images
1.9 kube init初始化master(主节点上操作)
(1)kube init流程
- 进行一系列检查,以确定这台机器可以部署kubernetes
- 生成kubernetes对外提供服务所需要的各种证书可对应目录/etc/kubernetes/pki/*
- 为其他组件生成访问kube-ApiServer所需的配置文件
ls /etc/kubernetes/
admin.conf controller-manager.conf kubelet.conf scheduler.conf
- 为 Master组件生成Pod配置文件。
ls /etc/kubernetes/manifests/*.yaml kube-apiserver.yaml kube-controller-manager.yaml kube-scheduler.yaml
- 生成etcd的Pod YAML文件。
ls /etc/kubernetes/manifests/*.yaml kube-apiserver.yaml kube-controller-manager.yaml kube-scheduler.yaml etcd.yaml
- 一旦这些 YAML 文件出现在被 kubelet 监视的/etc/kubernetes/manifests/目录下,kubelet就会自动创建这些yaml文件定义的pod,即master组件的容器。master容器启动后,kubeadm会通过检查localhost:6443/healthz这个master组件的健康状态检查URL,等待master组件完全运行起来
- 为集群生成一个bootstrap token
- 将ca.crt等 Master节点的重要信息,通过ConfigMap的方式保存在etcd中,工后续部署node节点使用
- 最后一步是安装默认插件,kubernetes默认kube-proxy和DNS两个插件是必须安装的
上面说完了操作init的流程,那接下来就是从主节点开始操作这些流程的命令了;
(2)初始化master节点
官网:https://kubernetes.io/docs/reference/setup-tools/kubeadm/
在主节点执行下面命令
# 本地有镜像 kubeadm init --kubernetes-version=1.14.0 --apiserver-advertise-address=192.168.0.105 --pod-network-cidr=192.168.0.0/16 【若要重新初始化集群状态:kubeadm reset,然后再进行上述操作】
显示下面上半句话就说明主节点搞定了,下半是要接着执行的命令,最后一个红框是kubeadm join的信息,一定要保存好
我的kubeadm join的信息
kubeadm join 192.168.0.105:6443 --token 5nmd9c.jmybcy25lqemuh3w \ --discovery-token-ca-cert-hash sha256:a9c6c59d89caad4d0cb9d2cda84460dd244b5bcbb806755b6a72f3f443e72c9d
(3)根据日志提示
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
(4)查看pod验证一下
kubectl get pods
发现没有资源发现
用命令
kubectl get pods -n kube-system
等待一会儿,同时可以发现像etc,controller,scheduler等组件都以pod的方式安装成功了
(5)健康检查
curl -k https://localhost:6443/healthz
1.10 部署calico网络插件(主节点)
上图的DNS解析没有生效原因就是差个网络插件,官网上有很多的推荐,我们选一个;
官网的网络插件:https://kubernetes.io/docs/concepts/cluster-administration/addons/
calico网络插件:https://projectcalico.docs.tigera.io/about/about-calico
在k8s中安装calico
kubectl apply -f https://docs.projectcalico.org/v3.9/manifests/calico.yaml
确认一下calico是否安装成功
kubectl get pods --all-namespaces -w
1.11 kube join
记得保存初始化master节点的最后打印信息【注意这边大家要自己的,下面我的只是一个参考】
kubeadm join 192.168.0.105:6443 --token 5nmd9c.jmybcy25lqemuh3w \ --discovery-token-ca-cert-hash sha256:a9c6c59d89caad4d0cb9d2cda84460dd244b5bcbb806755b6a72f3f443e72c9d
(1)在woker01和worker02上执行上述命令
(2)在master节点上检查集群信息,可以看到是Ready状态
kubectl get nodes
NAME STATUS ROLES AGE VERSION master-kubeadm-k8s Ready master 19m v1.14.0 worker01-kubeadm-k8s Ready <none> 3m6s v1.14.0 worker02-kubeadm-k8s Ready <none> 2m41s v1.14.0
1.12 再次体验Pod
(1)定义pod.yml文件,比如pod_nginx_rs.yaml;直接在控制板上执行下面代码就行
cat > pod_nginx_rs.yaml <<EOF apiVersion: apps/v1 kind: ReplicaSet metadata: name: nginx labels: tier: frontend spec: replicas: 3 selector: matchLabels: tier: frontend template: metadata: name: nginx labels: tier: frontend spec: containers: - name: nginx image: nginx ports: - containerPort: 80 EOF
然后ls会发现yml文件创建成功了。
(2)根据pod_nginx_rs.yml文件创建pod
kubectl apply -f pod_nginx_rs.yaml
(3)查看pod
kubectl get pods #三个nginx会创建成功 kubectl get pods -o wide #查看详情情况 kubectl describe pod nginx
(4)感受通过rs将pod扩容
kubectl scale rs nginx --replicas=5 kubectl get pods -o wide
(5)删除pod
kubectl delete -f pod_nginx_rs.yaml
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!