安装k8s,OpenEBS,KubeSphere
网络防火墙配置编辑注意,在开始安装前,如果您的服务器所在的网络开启了防火墙,请参考如下列表并根据实际情况开放相关的端口,若没有开启防火墙则无需在主机配置该项内容。服务协议操作起始端口结束端口备注sshTCPallow22etcdTCPallow23792380apiserverTCPallow6443calicoTCPallow90999100bgpTCPallow179nodeportTCP
网络防火墙配置
注意,在开始安装前,如果您的服务器所在的网络开启了防火墙,请参考如下列表并根据实际情况开放相关的端口,若没有开启防火墙则无需在主机配置该项内容。
服务 | 协议 | 操作 | 起始端口 | 结束端口 | 备注 |
---|---|---|---|---|---|
ssh | TCP | allow | 22 | ||
etcd | TCP | allow | 2379 | 2380 | |
apiserver | TCP | allow | 6443 | ||
calico | TCP | allow | 9099 | 9100 | |
bgp | TCP | allow | 179 | ||
nodeport | TCP | allow | 30000 | 32767 | |
master | TCP | allow | 10250 | 10258 | |
dns | TCP | allow | 53 | ||
dns | UDP | allow | 53 | ||
local-registry | TCP | allow | 5000 | 离线环境安装 | |
local-apt | TCP | allow | 5080 | 离线环境安装 | |
rpcbind | TCP | allow | 111 | 使用 NFS 作为持久化存储 | |
ipip | IPIP | allow | Calico 需要允许 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,以下步骤供参考:
- 例如本示例有一个 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
- 确认 master 节点是否有 Taint,如下看到 master 节点有 Taint。
$ kubectl describe node master | grep Taint
Taints: node-role.kubernetes.io/master:NoSchedule
- 去掉 master 节点的 Taint:
$ kubectl taint nodes master node-role.kubernetes.io/master:NoSchedule-
此时可参考安装 OpenEBS 的步骤继续操作。
安装 OpenEBS
- 创建 OpenEBS 的 namespace,OpenEBS 相关资源将创建在这个 namespace 下:
$ kubectl create ns openebs
- 安装 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
- 安装 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
- 如下将
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
-
至此,OpenEBS 的 LocalPV 已作为默认的存储类型创建成功。可以通过命令
kubectl get pod -n openebs
来查看 OpenEBS 相关 Pod 的状态,若 Pod 的状态都是 running,则说明存储安装成功。 -
提示:由于在文档开头手动去掉了 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.yaml和cluster-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
更多推荐
所有评论(0)