网络防火墙配置

编辑

注意,在开始安装前,如果您的服务器所在的网络开启了防火墙,请参考如下列表并根据实际情况开放相关的端口,若没有开启防火墙则无需在主机配置该项内容。

服务协议操作起始端口结束端口备注
sshTCPallow22
etcdTCPallow23792380
apiserverTCPallow6443
calicoTCPallow90999100
bgpTCPallow179
nodeportTCPallow3000032767
masterTCPallow1025010258
dnsTCPallow53
dnsUDPallow53
local-registryTCPallow5000离线环境安装
local-aptTCPallow5080离线环境安装
rpcbindTCPallow111使用 NFS 作为持久化存储
ipipIPIPallowCalico 需要允许 IPIP 协议

安装k8s(前期配置忽略)

初始化kubeadm

$ kubeadm init \
--apiserver-advertise-address=47.93.136.199 \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--kubernetes-version v1.17.3 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16


# 命令解释-----------------------------------------------
$ kubeadm init \ #初始化
--apiserver-advertise-address=xx.xx.xx.xx \ # 指定apiserver的地址也就是master的地址
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \ # 指定用阿里云镜像
--kubernetes-version v1.17.3 \ #指定Kubernetes的版本
--service-cidr=10.96.0.0/16  \ #
--pod-network-cidr=10.244.0.0/16

# 清理下第一次初始化的文件
kubeadm reset

⚠️生产模式初始化遇到的坑(阿里云)

错误信息
Unfortunately, an error has occurred:
        timed out waiting for the condition

This error is likely caused by:
        - The kubelet is not running
        - The kubelet is unhealthy due to a misconfiguration of the node in some way (required cgroups disabled)

If you are on a systemd-powered system, you can try to troubleshoot the error with the following commands:
        - 'systemctl status kubelet'
        - 'journalctl -xeu kubelet'
12345678910

etcd可以通过公网ip部署集群,而且可以运行应用,但是集群节点信息里是没有公网ip的,而且貌似k8s是让kubelet直接与apiserver通过内网通信的,使用kubectl log等命令时还是用的内网IP,所以会提示timeout。要想真正实现公网ip部署k8s还是配置iptables进行重定向或其它更专业的方式。传送门

我这里的解决方案

自己琢磨出来,不能用外网初始化,换成内网试试

准备两个终端,在kubeadm初始化过程中对etcd进行修改

⚠️⚠️⚠️一定要在初始化中,不然初始化的时候会覆盖配置

# 执行kubeadm init
# 用另外一个终端
vi /etc/kubernetes/manifests/etcd.yaml

#------------修改前,只复制了重点--------------------
  containers:
  - command:
    - etcd
    - --advertise-client-urls=https://xx.xx.xx.xx:2379
    - --cert-file=/etc/kubernetes/pki/etcd/server.crt
    - --client-cert-auth=true
    - --data-dir=/var/lib/etcd
    - --initial-advertise-peer-urls=https://xx.xx.xx.xx:2380
    - --initial-cluster=master=https://xx.xx.xx.xx:2380
    - --key-file=/etc/kubernetes/pki/etcd/server.key
    - --listen-client-urls=https://127.0.0.1:2379,https://xx.xx.xx.xx:2379# 修改这里
    - --listen-metrics-urls=http://127.0.0.1:2381
    - --listen-peer-urls=https://xx.xx.xx.xx:2380 # 修改这里
    - --name=master
    - --peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt
    - --peer-client-cert-auth=true
    - --peer-key-file=/etc/kubernetes/pki/etcd/peer.key
    - --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
    - --snapshot-count=10000
    - --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt

#--------------------修改后-----------------------------
  containers:
  - command:
    - etcd
    - --advertise-client-urls=https://xx.xx.xx.xx:2379
    - --cert-file=/etc/kubernetes/pki/etcd/server.crt
    - --client-cert-auth=true
    - --data-dir=/var/lib/etcd
    - --initial-advertise-peer-urls=https://xx.xx.xx.xx:2380
    - --initial-cluster=master=https://xx.xx.xx.xx:2380
    - --key-file=/etc/kubernetes/pki/etcd/server.key
    - --listen-client-urls=https://127.0.0.1:2379 # 改成这样
    - --listen-metrics-urls=http://127.0.0.1:2381
    - --listen-peer-urls=https://127.0.0.1:2380 # 改成这样
    - --name=master
    - --peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt
    - --peer-client-cert-auth=true
    - --peer-key-file=/etc/kubernetes/pki/etcd/peer.key
    - --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
    - --snapshot-count=10000
    - --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647

由于默认拉取镜像地址k8s.cr.io国内无法访问,这里指定阿里云仓库地址。可以手动按照我们的images.sh先拉取镜像。

地址变为:registry.aliyuncs.com/googole_containers也可以。
科普:无类别域间路由(Classless Inter-Domain Routing 、CIDR)是一个用于给用户分配IP地址以及在互联网上有效第路由IP数据包的对IP地址进行归类的方法。
拉取可能失败,需要下载镜像。

执行完成后控制台打印结果
Your Kubernetes control-plane has initialized successfully!
#您的Kubernetes控制面板已成功初始化!

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

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/

Then you can join any number of worker nodes by running the following on each as root:
# 这里一定要留个备份,意思说,您可以通过在每个节点上以超级用户身份运行以下命令来加入让任意多的node节点加入master

kubeadm join 172.26.215.100:6443 --token 3788fx.y6bp0nvq8ejaazxo \
    --discovery-token-ca-cert-hash sha256:865b99aee73005e810f76e9a4a42de5836d570e9a3f8b9142c7306e897d98b2a 
1234567891011121314151617181920

测试Kubectl(主节点执行)

以前安装过要执行下一下命令
rm -rf $HOME/.kube
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

详细部署文档

#获取所有节点
$ kubectl get nodes
# 目前Master状态为notready。等待网络加入完成即可。
$ journalctl -u kubelet #查看kubelet日志
1234
加入节点的token令牌(根据自己生成的走,如果不小心清屏了,下面有解决方案token默认两个小时有效)
kubeadm join 10.0.2.15:6443 --token ppzpi7.qrb6jaxqwaxtnwss \
    --discovery-token-ca-cert-hash sha256:14939d558594509c33c551bdbb75578b19fabbd7c95fb3b8e15a5a1aec378613
12
如果token过期了怎么办
kubeadm token create --print-join-command # 重新创建一个
kubeadm token create --ttl0 --print-join-command # 创建一个永久的
12

安装POD网络插件(CNI)

我们选用Flannel 是可与Kubernetes一起使用的覆盖网络提供商。

官网

在master节点上执行按照POD网络插件
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

以上地址可能被墙,可以直接获取本地已经下载的flannel.yml运行即

本地文件

[root@k8s-node1 k8s]# kubectl apply -f  kube-flannel.yml
podsecuritypolicy.policy/psp.flannel.unprivileged 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-amd64 created
daemonset.apps/kube-flannel-ds-arm64 created
daemonset.apps/kube-flannel-ds-arm created
daemonset.apps/kube-flannel-ds-ppc64le created
daemonset.apps/kube-flannel-ds-s390x created
#--------------------------如果想删除这个文件应用的配置----------------------------------
[root@k8s-node1 k8s]# kubectl delete -f  kube-flannel.yml
12345678910111213

同时flannel.yml中指定的images访问不到可以去docker hub找一个wget yml地址
vi 修改yml 所有amd64的地址修改了即可
等待大约3分钟

查看名称空间
[root@k8s-node1 k8s]# kubectl get ns
NAME              STATUS   AGE
default           Active   28m
kube-node-lease   Active   28m
kube-public       Active   28m
kube-system       Active   28m
123456
查看指定名称空间的pods
[root@k8s-node1 k8s]# kubectl get pods -n kube-system
NAME                                READY   STATUS    RESTARTS   AGE
coredns-7f9c544f75-fjqdn            1/1     Running   0          30m
coredns-7f9c544f75-rmk2c            1/1     Running   0          30m
etcd-k8s-node1                      1/1     Running   0          30m
kube-apiserver-k8s-node1            1/1     Running   0          30m
kube-controller-manager-k8s-node1   1/1     Running   0          30m
kube-flannel-ds-amd64-m9cnc         1/1     Running   0          6m43s
kube-proxy-2lwtr                    1/1     Running   0          30m
kube-scheduler-k8s-node1            1/1     Running   0          30m
12345678910
获取所有名称名称空间的POD
[root@k8s-node1 k8s]# kubectl get pods --all-namespaces
NAMESPACE     NAME                                READY   STATUS    RESTARTS   AGE
kube-system   coredns-7f9c544f75-fjqdn            1/1     Running   0          29m
kube-system   coredns-7f9c544f75-rmk2c            1/1     Running   0          29m
kube-system   etcd-k8s-node1                      1/1     Running   0          28m
kube-system   kube-apiserver-k8s-node1            1/1     Running   0          28m
kube-system   kube-controller-manager-k8s-node1   1/1     Running   0          28m
kube-system   kube-flannel-ds-amd64-m9cnc         1/1     Running   0          4m50s
kube-system   kube-proxy-2lwtr                    1/1     Running   0          29m
kube-system   kube-scheduler-k8s-node1            1/1     Running   0          28m
12345678910

⚠️kube-flannel-ds-amd64-m9cnc 一定要是运行状态,才可以操作接下来的步骤,如果未运行,请等待

获取master上所以节点

[root@k8s-node1 k8s]# kubectl get nodes
NAME        STATUS   ROLES    AGE   VERSION
k8s-node1   Ready    master   35m   v1.17.3  #status为ready才能够执行下面的命令
[root@k8s-node1 k8s]# 
1234

让别的节点加入master

⚠️ 复制自己的初始化kubeadm控制台有打印

kubeadm join 10.0.2.15:6443 --token ppzpi7.qrb6jaxqwaxtnwss \
    --discovery-token-ca-cert-hash sha256:14939d558594509c33c551bdbb75578b19fabbd7c95fb3b8e15a5a1aec378613 
12
[root@k8s-node1 opt]# kubectl get nodes;
NAME        STATUS     ROLES    AGE   VERSION
k8s-node1   Ready      master   47m   v1.17.3
k8s-node2   NotReady   <none>   75s   v1.17.3
k8s-node3   NotReady   <none>   76s   v1.17.3
12345

监控pod进度

watch kubectl get pod -n kube-system -o wide
等到所有的status都变为running状态后,再次查看节点信息:
[root@k8s-node1 ~]#  kubectl get nodes                       
NAME        STATUS   ROLES    AGE     VERSION
k8s-node1   Ready    master   3h50m   v1.17.3
k8s-node2   Ready    <none>   3h3m    v1.17.3
k8s-node3   Ready    <none>   3h3m    v1.17.3

安装 OpenEBS

前提条件

  • 已有 Kubernetes 集群,并安装了 kubectl 或 Helm
  • Pod 可以被调度到集群的 master 节点(可临时取消 master 节点的 Taint)

关于第二个前提条件,是由于安装 OpenEBS 时它有一个初始化的 Pod 需要在 master 节点启动并创建 PV 给 KubeSphere 的有状态应用挂载。因此,若您的 master 节点存在 Taint,建议在安装 OpenEBS 之前手动取消 Taint,待 OpenEBS 与 KubeSphere 安装完成后,再对 master 打上 Taint,以下步骤供参考:

  1. 例如本示例有一个 master 节点,节点名称即 master,可通过以下命令查看节点名称:
$ kubectl get node -o wide
NAME     STATUS   ROLES    AGE     VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION          CONTAINER-RUNTIME
master   Ready    master   6d18h   v1.15.5   192.168.0.6    <none>        CentOS Linux 7 (Core)   3.10.0-693.el7.x86_64   docker://18.9.7
node1    Ready    worker   6d18h   v1.15.5   192.168.0.7    <none>        CentOS Linux 7 (Core)   3.10.0-693.el7.x86_64   docker://18.9.7
node2    Ready    worker   6d18h   v1.15.5   192.168.0.10   <none>        CentOS Linux 7 (Core)   3.10.0-693.el7.x86_64   docker://18.9.7
  1. 确认 master 节点是否有 Taint,如下看到 master 节点有 Taint。
$ kubectl describe node master | grep Taint
Taints:             node-role.kubernetes.io/master:NoSchedule
  1. 去掉 master 节点的 Taint:
$ kubectl taint nodes master node-role.kubernetes.io/master:NoSchedule-

此时可参考安装 OpenEBS 的步骤继续操作。

安装 OpenEBS

  1. 创建 OpenEBS 的 namespace,OpenEBS 相关资源将创建在这个 namespace 下:
$ kubectl create ns openebs
  1. 安装 OpenEBS,以下列出两种方法,可参考其中任意一种进行创建:

A. 若集群已安装了 Helm,可通过 Helm 命令来安装 OpenEBS:

helm init

helm install --namespace openebs --name openebs stable/openebs --version 1.5.0

B. 除此之外 还可以通过 kubectl 命令安装:

$ kubectl apply -f https://openebs.github.io/charts/openebs-operator-1.5.0.yaml
  1. 安装 OpenEBS 后将自动创建 4 个 StorageClass,查看创建的 StorageClass:
$ kubectl get sc
NAME                        PROVISIONER                                                AGE
openebs-device              openebs.io/local                                           10h
openebs-hostpath            openebs.io/local                                           10h
openebs-jiva-default        openebs.io/provisioner-iscsi                               10h
openebs-snapshot-promoter   volumesnapshot.external-storage.k8s.io/snapshot-promoter   10h
  1. 如下将 openebs-hostpath设置为 默认的 StorageClass
$ kubectl patch storageclass openebs-hostpath -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
storageclass.storage.k8s.io/openebs-hostpath patched
  1. 至此,OpenEBS 的 LocalPV 已作为默认的存储类型创建成功。可以通过命令 kubectl get pod -n openebs来查看 OpenEBS 相关 Pod 的状态,若 Pod 的状态都是 running,则说明存储安装成功。

  2. 提示:由于在文档开头手动去掉了 master 节点的 Taint,我们可以在安装完 OpenEBS 和 KubeSphere 后,可以将 master 节点 Taint 加上,避免业务相关的工作负载调度到 master 节点抢占 master 资源:

    $ kubectl taint nodes master node-role.kubernetes.io/master=:NoSchedule
    

安装KubeSphere

部署KubeSphere

确保您的计算机满足前提条件之后,您可以按照以下步骤安装KubeSphere。

  • 执行以下命令:
kubectl apply -f https://raw.githubusercontent.com/kubesphere/ks-installer/v3.0.0/deploy/kubesphere-installer.yaml
kubectl apply -f https://raw.githubusercontent.com/kubesphere/ks-installer/v3.0.0/deploy/cluster-configuration.yaml

注解

如果您的服务器无法访问GitHub,则可以分别复制kubesphere-installer.yamlcluster-configuration.yaml中的内容并将其粘贴到本地文件中。然后,您可以使用kubectl apply -f本地文件来安装KubeSphere。

检查安装日志:

kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f
  • 使用kubectl get pod --all-namespaces,看看是否所有的舱体在KubeSphere相关的命名空间运行正常。如果是,请通过以下命令检查控制台的端口(默认为30880):
kubectl get svc/ks-console -n kubesphere-system
  • 确保在安全组中打开了端口30880,并使用IP:30880默认帐户和密码(admin/P@88w0rd)通过NodePort()访问Web控制台。
  • 登录控制台后,您可以在组件中检查不同组件的状态。如果要使用相关服务,可能需要等待某些组件启动并运行。

问题

find / -name    查找文件

查看日志

kubectl describe pod maya-apiserver-7f664b95bb-88dhz  --namespace=openebs

删除node节点


[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 56d v1.15.3
node01 Ready <none> 56d v1.15.3
node02 Ready <none> 56d v1.15.3

[root@master ~]# kubectl drain node02 --delete-local-data --force --ignore-daemonsets
# 删除 node02
[root@master ~]# kubectl delete node node02

[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 56d v1.15.3
node01 Ready <none> 56d v1.15.3

之后被删除机器执行
kubeadm reset

Logo

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

更多推荐