一、搭建k8s集群
1.1搭建k8s集群部署方式
1.1.1目前生产部署 Kubernetes 集群主要有两种方式:
(1)bubeam
Kubeadm 是一个 K8s 部署工具,提供 kubeadm init 和 kubeadm join,用于快速部署
Kubernetes 集群。
官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
(2)二进制包
从 github 下载发行版的二进制包,手动部署每个组件,组成 Kubernetes 集群
Kubeadm 降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可控,推荐使用
二进制包部署 Kubernetes 集群,虽然手动部署麻烦点,期间可以学习很多工作原理,也利于后期
维护。
1.2bubeadm前置部署
kubeadm 是官方社区推出的一个用于快速部署 kubernetes 集群的工具,这个工具能通过两条指
令完成一个 kubernetes 集群的部署:
第一、创建一个 Master 节点 kubeadm init
第二, 将 Node 节点加入到当前集群中 $ kubeadm join<Master 节点的 IP 和端口 >
1.2.1安装要求
在开始之前,部署 Kubernetes 集群机器需要满足以下几个条件:
一台或多台机器,操作系统 CentOS7.x-86_x64
硬件配置:2GB 或更多 RAM,2 个 CPU 或更多 CPU,硬盘 30GB 或更多
集群中所有机器之间网络互通
可以访问外网,需要拉取镜像
禁止 swap 分区
1.2.2准备环境
1.2.3安装基本服务
yum install wget vim epel-release ntpdate conntrack ntp ipvsadm ipset jq iptables curl sysstat libseccomp -y
1.2.4 系统初始化
(1)关闭防火墙并设置开机不自启
systemctl stop firewalld && systemctl disable firewalld
(2)关闭selinux服务
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config #永久关闭 selinux setenforce 0 #临时关闭selinux
(3)关闭swap
swapoff -a #临时关闭swap sed -ri 's/.*swap.*/#&/' /etc/fstab #永久关闭swap
(4)设置主机名
hostnamectl set-hostname <hostname> #根据规划设置
(5)添加映射
cat >> /etc/hosts << EOF 192.168.75.55 k8smaster 192.168.75.56 k8s-node EOF
(6)将桥接的IPV4流量传递到iptables的链:
cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl --system #使其生效
1.3 所以节点安装 Docker和kubeadm和kubelet
Kubernetes 默认 CRI(容器运行时)为 Docker,因此先安装 Docker
1.3.1 安装docker
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo yum install docker-ce-19.03.11 -y systemctl start docker && systemctl enable docker docker --version
1.3.2配置docker镜像加速
mkdir -p /etc/docker cat > /etc/docker/daemon.json << EOF { "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"] } EOF systemctl daemon-reload systemctl restart docker
1.3.3添加yum源
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 clean all && yum makecache
1.3.4安装kubeadm,kubelet 和 kubectl
yum install -y kubelet-1.18.0 kubeadm-1.18.1 kubectl-1.18.1 systemctl enable kubelet
1.4 部署kubernetes Master
在192.168.75.110(Master)执行。
kubeadm init --apiserver-advertise-address=192.168.75.10 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.1 --servicecidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16
1.4.1完成后根据提示完成操作
mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config kubectl get nodes #查看node节点
1.4.2 加入Kubernetes Node
在192.168.75.111/112(node)执行。
向集群添加新节点,执行Kubeadm init输出的kubeadm Join命令:(根据结尾自己的命令)
kubeadm join 192.168.75.110:6443 --token twjnag.eqlezwll77deahjz \ --discovery-token-ca-cert-hash sha256:8402d0e19ba5cf7e75f4b32086cb63b6f0f5c328ee5168af5cded77a0b7a4f37
完成后可以使用以下命令查看是否加入成功:
默认token有效期为24小时,当过期后,该token就不可用了。这时就需要重新创建token,操作如下:
kubeadm token create --print-join-command
1.4.3部署CNI网络插件
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kubeflannel.yml namespace/kube-flannel created clusterrole.rbac.authorization.k8s.io/flannel created clusterrolebinding.rbac.authorization.k8s.io/flannel created serviceaccount/flannel created configmap/kube-flannel-cfg created daemonset.apps/kube-flannel-ds created kubectl get pods -n kube-system #查看运行状况
如果无法访问外网则访问下面的地址,下载到本地再传到服务器
https://www.aliyundrive.com/s/2VFpYQizPXe
传入后执行以下命令:
kubectl apply -f kube-flannel.yaml
查看运行状况
[root@master ~]# kubectl get pod -n kube-flannel NAME READY STATUS RESTARTS AGE kube-flannel-ds-njn4c 1/1 Running 0 3m49s kube-flannel-ds-wht29 1/1 Running 0 3m49s
1.4.4测试kubernetes集群
在Kubernetes集群中创建一个pod,验证是否正常运行:
kubectl create deployment nginx --image=nginx kubectl expose deployment nginx --port=80 --type=NodePort kubectl get pod,svc
测试:http://NodeIP:port/