centos7虚拟机搭建k8s集群
一、环境准备
准备3台虚拟机,版本为centos7
,我这里ip分别为 192.168.133.10、192.168.133.11、192.168.133.12,三台虚拟机的hostname
分别设置为k8s-master
、k8s-node1
、k8s-node2
,这样看起来直观一点。可通过hostnamectl set-hostname xxxx
来设置hostname
,设置完成后,重新连接虚拟机即可。
# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
#关闭swap
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
二、安装docker
1、安装docker
卸载旧版本,如果没有安装则可不执行
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
安装docker
# 安装yum-utils以支持yum-config-manager模块
yum install -y yum-utils
# 配置阿里云节点加速
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装docker,指定版本号,避免后面与k8s冲突
yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io-1.4.6
设置docker开机自启
systemctl enable docker --now
2、配置docker镜像加速
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://i2ovbgkg.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
重启docker
systemctl daemon-reload
systemctl restart docker
三、安装kubelet、kubeadm、kubectl
1、网络设置
#允许 iptables 检查桥接流量
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system
2、配置阿里云k8s加速
cat <<EOF | sudo tee /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
exclude=kubelet kubeadm kubectl
EOF
3、安装指定版本
yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes
4、设置kubelet开机自启
systemctl enable --now kubelet
5、设置集群端点host
echo "192.168.133.10 cluster-endpoint" >> /etc/hosts
注:以上的设置适用于所有的虚拟机
四、主节点初始化
这里的命令只适用于master
节点
kubeadm init \
--apiserver-advertise-address=192.168.133.10 \
--control-plane-endpoint=cluster-endpoint \
--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16
上面的命令只需要在主节点执行,执行可能会比较慢,等待几分钟即可。至于service-cidr
以及pod-network-cidr
,暂时还没时间去弄懂为啥要这么写。
执行完成后会打印如下的信息,先记下来
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
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/
You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:
kubeadm join cluster-endpoint:6443 --token mjcoa7.jq71xluq54aa6tmf \
--discovery-token-ca-cert-hash sha256:c4c8f5380d80d30bca71534ae0228ef5025a0f47dc5f5cd31a5ec795e039b91e \
--control-plane
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join cluster-endpoint:6443 --token mjcoa7.jq71xluq54aa6tmf \
--discovery-token-ca-cert-hash sha256:c4c8f5380d80d30bca71534ae0228ef5025a0f47dc5f5cd31a5ec795e039b91e
而在这上面还打印了一些需要我们执行的命令,首先是,如果要使用集群,则需要执行一些命令,如果是普通用户,则执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
如果是root用户,则执行下面的命令,因为我是用的root用户,所以执行这个命令
export KUBECONFIG=/etc/kubernetes/admin.conf
上面的信息中还提示我们需要部署一个pod网络插件,如果不安装这个网络插件,集群是用不了的,可以使用kubectl get nodes
命令来看下集群信息,打印如下
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane,master 43m v1.20.9
从上面看到,只有一个节点,且状态还是NotReady
,原因就是未安装pod网络节点,接下来就去安装网络插件。
从提示信息中可以看到,网络插件的安装,官网有文档:https://kubernetes.io/docs/concepts/cluster-administration/addons/,打开这个链接,可以看到k8s支持很多的网络插件,我们这里选择Calico
,安装文档参考官网:https://docs.projectcalico.org/getting-started/kubernetes/self-managed-onprem/onpremises#install-calico-with-kubernetes-api-datastore-more-than-50-nodes
curl https://docs.projectcalico.org/manifests/calico.yaml -O
kubectl apply -f calico.yaml
等一下再使用kubectl get nodes
命令查看节点状态,已经是Ready
了
从上面的信息中看到,如果需要将主节点加入到集群,只需要执行
kubeadm join cluster-endpoint:6443 --token mjcoa7.jq71xluq54aa6tmf \
--discovery-token-ca-cert-hash sha256:c4c8f5380d80d30bca71534ae0228ef5025a0f47dc5f5cd31a5ec795e039b91e \
--control-plane
而如果是需要将工作节点加入到集群,则执行
kubeadm join cluster-endpoint:6443 --token mjcoa7.jq71xluq54aa6tmf \
--discovery-token-ca-cert-hash sha256:c4c8f5380d80d30bca71534ae0228ef5025a0f47dc5f5cd31a5ec795e039b91e
可以看到,主节点就比工作节点多了个--control-plane
,其他都一样
下面是几个常用k8s命令
#查看集群所有节点
kubectl get nodes
#根据配置文件,给集群创建资源
kubectl apply -f xxxx.yaml
#查看集群部署了哪些应用?
docker ps === kubectl get pods -A
# 运行中的应用在docker里面叫容器,在k8s里面叫Pod
kubectl get pods -A
五、工作节点加入集群
在上面的步骤中,我们将部分提示信息复制了出来,其中就有工作节点加入集群的命令。分别在node1和node2中执行如下命令即可将这两个节点加入集群
kubeadm join cluster-endpoint:6443 --token mjcoa7.jq71xluq54aa6tmf \
--discovery-token-ca-cert-hash sha256:c4c8f5380d80d30bca71534ae0228ef5025a0f47dc5f5cd31a5ec795e039b91e
命令执行后,打印如下的提示信息即说明加入集群成功了
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
根据提示信息,我们到master节点中执行kubectl get nodes
即可查看节点信息,若节点状态不是Ready
,则稍等一会儿即可。
# 查看运行中的pod,相当于docker ps,需要在master节点中执行
kubectl get pod -A
# 阻塞查看
kubectl get pod -A -w
特别说明,加入集群的token有效期是24小时,token过期后若有新的节点需要加入到集群中,则需要在master中重新生成新的token
kubeadm token create --print-join-command
如果加入时命令错了,或者主节点挂了需要重新安装,这时候需要重新加入怎么办?
https://blog.csdn.net/weixin_44953658/article/details/112094391
1、重置
kubeadm reset
2、重新加入
六、自修复能力测试
将任意机器重启,重启过程中,在master节点中使用命令watch -n 1 kubectl get pods -A
观察各个pod的状态,可以发现,最终都会变为running。
七、安装k8s可视化界面dashboard
安装方式参照官方github地址:https://github.com/kubernetes/dashboard
# 安装图形化界面
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml
编辑dashboard的svc,对应命名空间(-n)是kubernetes-dashboard
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
需要修改的内容:将spec下的type由ClusterIP改为NodePort,为的是将dashboard的端口暴露出去
上面的行不通,参考下面的https://blog.csdn.net/mshxuyi/article/details/108425487
使用kubectl get svc -A
命令查看服务
$ kubectl get svc -A
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5h52m
kube-system kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 5h52m
kubernetes-dashboard dashboard-metrics-scraper ClusterIP 10.96.137.165 <none> 8000/TCP 85s
kubernetes-dashboard kubernetes-dashboard ClusterIP 10.96.131.136 <none> 443/TCP 85s
dashboard 服务的类型是ClusterIP
,不便于我们通过浏览器访问,因此需要改成NodePort
型的
# 查看服务信息
$ kubectl get svc kubernetes-dashboard -n kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes-dashboard ClusterIP 10.96.131.136 <none> 443/TCP 22m
删除现有的dashboard服务
kubectl delete service kubernetes-dashboard --namespace=kubernetes-dashboard
创建配置文件
vim dashboard-svc.yaml
文件内容如下
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort
ports:
- port: 443
targetPort: 8443
selector:
k8s-app: kubernetes-dashboard
根据配置文件创建服务
kubectl apply -f dashboard-svc.yaml
接下来需要创建访问用户
新建配置文件
vim dashboard-svc-account.yaml
文件内容如下
apiVersion: v1
kind: ServiceAccount
metadata:
name: dashboard-admin
namespace: kube-system
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: dashboard-admin
subjects:
- kind: ServiceAccount
name: dashboard-admin
namespace: kube-system
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
执行,根据配置文件创建用户
kubectl apply -f dashboard-svc-account.yaml
获取token
执行
kubectl get secret -n kube-system |grep admin|awk '{print $1}'
会打印一行数据dashboard-admin-token-xxxxx
,接下来获取token
kubectl describe secret dashboard-admin-token-xxxxx -n kube-system|grep '^token'|awk '{print $2}'
打印的结果就是token,很长,复制出来,登录时需要用到
登录地址:https://master_ip:port
,端口可通过kubectl get svc kubernetes-dashboard -n kubernetes-dashboard
查看
参考
下一篇: Android如何制作.9图片