一、环境准备

准备3台虚拟机,版本为centos7,我这里ip分别为 192.168.133.10、192.168.133.11、192.168.133.12,三台虚拟机的hostname分别设置为k8s-masterk8s-node1k8s-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查看


参考

https://www.yuque.com/leifengyang/oncloud/ghnb83#SDlhV

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐