快速搭建kubernetes与kubeSphere环境(亲测有效)

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 快速搭建kubernetes与kubeSphere环境

学习k8s,但是安装k8s实在太麻烦了,也耗费了不少时间,下面来说说安装步骤。以下是我的机器配置,其实2核4G也可以,但是因为我想学习下kubeSphere就要求配置高了,我在这上面也耗费了不少时间,鄙人特将学习过程记录下来,希望各位看官给个赞,码字不易,越看越有劲。

b4d9ab64c198e3aa95dc2452bf0d1d3.png

第一步-修改hostname(可选)

如果在安装使用k8s中出现以下错误, 则需要修改hostname:

name: Invalid value: "k8s_master": a DNS-1123 subdomain must consist of lower case alphanumeric characters, '-' or '.', and must start and end with an alphanumeric character (e.g. 'example.com', regex used for
 validation is '[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*')

出现hostname不合法的情况, 执行以下命令修改hostname

# 修改 hostname
hostnamectl set-hostname your-new-host-name
# 查看修改结果
hostnamectl status
# 设置 hostname 解析
echo "127.0.0.1   $(hostname)" >> /etc/hosts

第二步-安装必要软件

使用 root 身份在所有节点执行如下代码,以安装软件:

  • docker
  • nfs-utils
  • kubectl / kubeadm / kubelet
# 在 master 节点和 worker 节点都要执行
curl -sSL https://kuboard.cn/install-script/v1.15.4/install-kubelet.sh | sh

脚本具体内容=> install-kubelet.sh

第三步-安装k8s单Master节点集群

注意事项:

  • 以 root 身份在 master-k8s 机器上执行
  • 初始化 master 节点时,如果因为中间某些步骤的配置出错,想要重新初始化 master 节点,请先执行 kubeadm reset 操作
  • POD_SUBNET 所使用的网段不能与 master节点/worker节点 所在的网段重叠。该字段的取值为一个 CIDR 值,如果您对 CIDR 这个概念还不熟悉,请不要修改这个字段的取值 10.100.0.1/20

执行以下命令只在 master-k8s 节点机器执行

# 替换 x.x.x.x 为 master-k8s 节点实际 IP(请使用内网 IP)
# export 命令只在当前 shell 会话中有效,开启新的 shell 窗口后,如果要继续安装过程,请重新执行此处的 export 命令
export MASTER_IP=172.18.24.217
# 替换 apiserver.demo 为 您想要的 dnsName (不建议使用 master 的 hostname 作为 APISERVER_NAME)
export APISERVER_NAME=apiserver.demo
# Kubernetes 容器组所在的网段,该网段安装完成后,由 kubernetes 创建,事先并不存在于您的物理网络中
export POD_SUBNET=10.100.0.1/20
echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hosts
curl -sSL https://kuboard.cn/install-script/v1.15.4/init-master.sh | sh

脚本具体内容=> init-master.sh

检查 master 初始化结果

# 执行如下命令,等待 3-10 分钟,直到所有的容器组处于 Running 状态
watch kubectl get pod -n kube-system -o wide
# 查看 master 节点初始化结果
kubectl get nodes -o wide

第四步-初始化 worker节点

在 master-k8s 节点上执行以下命令

# 只在 master 节点执行
kubeadm token create --print-join-command
# 查看 master 节点初始化结果
kubectl get nodes -o wide

可获取 kubeadm join 命令及参数,如图所示

[root@master2 opt]# kubeadm token create --print-join-command
kubeadm join apiserver.demo:6443 --token 0lru1f.8mlxlriwnvnvp3bk  --discovery -token-ca-cert-hash sha256:415b30b68d9d9eb2be83a2e654f6c6be313972ed3a9e2e7630ee6371af3a6ea8 
[root@master2 opt]# 

在其它的work节点(也就是首图ecs中的node1,2,3)执行kubeadm join 命令及参数,如下图所示

[root@node2 ~]# kubeadm join apiserver.demo:6443  --token 71rjok.ztpwf84q1c2yq0p8 scoverv token-ca-cert-hash  sha256:415b30b68d9d9eb2be83a2e654f6c6be313972ed3a9e2e7630ee63 
71af3a6ea8
[preflight] Running pre-flight checks
preflight] Reading configuration from the cluster...
preflight] FYI: You can look at this config file with 'kubectl -n kube-system g et cm kubeadm-config -oyaml'
kubelet-start] Downloading configuration for the kubelet from the "kubelet-conf ig-1.15" ConfigMap in the kube-system namespace
aml"
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.y
Ckubelet-start] Writing kubelet environment file with flags to file "/var/lib/ku belet/kubeadm-flags.env" Tkubelet-start] Activating the kubelet service
kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...
This node has joined the cluster:
Certificate signing reauest was sent to apiserver and a response was received. AThe Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
[root@node2 ~]# 

此时再到 master-k8s节点执行 kubectl get nodes -o wide 可以看到有新的节点加入了

[root@master2 opt]# kubectl get nodes wide  
NAME  STATUS  ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-I  IMAGE KERNEL-VERSION  CONTAINER-RUNTIME 
master2 Ready master  21h v1.15.4 172.18.24.217 <none>  Cent( tOS Linux 7 (Core)  tOS Linux 7 (Core)  3.10.0-957.21.3.el7.x86_64  docker://18.9.7 
nodel Ready <none>  5h33m v1.15.4 172.18.24.219 <none>  Cent( 3.10.0-957.21.3.el7.x86_64  docker://18.9.7 
node2 Ready <none>  18h v1.15.4 172.18.24.220 <none>  Cent( tOS Linux 7 (Core)  3.10.0-957.21.3.el7.x86 64  docker://18.9.7 
node3 Ready <none>  6h53m v1.15.4 172.18.24.221 <none>  Cent  cOS Linux 7 (Core)  3.10.0-957.21.3.el7.x86 64  docker:/18.9

第五步-安装helm(kubeSphere准备工作)

执行以下命令

wget https://get.helm.sh/helm-v2.16.0-linux-amd64.tar.gz
tar zxvf helm-v2.16.0-linux-amd64.tar.gz 
mv linux-amd64/helm /usr/local/bin/
helm version

执行helm version 可以看到client已经安装好了,但是server端还没有安装。

[root@master2 download]# helm version
Client:&version.Version{SemVer:"v2.16.0",GitCommit:"e13bc94621d4ef666270cfbe7334aaabf342a49bb",GitTreeState:"clean"}
Error: could not find tiller  

创建rbac-config.yaml文件

vi rbac-config.yaml

输入以下内容:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: tiller
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: tiller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: tiller
    namespace: kube-system

保存后执行

kubectl create -f rbac-config.yaml
[root@master2 opt]# kubectl create -f rbac-config.yaml serviceaccount/tiller created
clusterrolebinding.rbac.authorization.k8s.io/tiller created
[root@master2 opt]# 

以上步骤配置成功后,安装tiller (和helm client的版本要一样)

# 以下命令二选一
# google源
helm init --service-account tiller --upgrade -i gcr.io/kubernetes-helm/tiller:v2.16.0
# 阿里源
helm init --service-account tiller --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.16.0 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
# 参数--stable-repo-url用于拉取charts所在源的位置,如果不设置则默认访问官方charts
# 查看tiller是否安装成功    
kubectl get pod -n kube-system -l app=helm
[root@master2 opt]# kubectl get pod -n kube-system -l app=helm
NAME  READY STATUS  RESTARTS  AGE 
tiller-deploy-54484dbdff-pvxhl  1/1 Running 

再次执行 helm version可以看到client和service都安装好了

[root@master2 opt]# helm version
Client:&version.Version{SemVer:"v2.16.0",GitCommit:"e13bc94621d4ef666270cfbe734aaabf342a49bb",GitTreeState: "clean"} Server:&version.Version{SemVer:"v2.16.0",GitCommit:"e13bc94621d4ef666270cfbe734aaabf342a49bb",GitTreeSt

第六步-正式部署 KubeSphere

版本要求:

框架 版本
Kubernetes >=1.13.0 && <=1.16.0
GitVersion >v1.13.0
Helm >= 2.10.0

机器要求:

集群work节点可用总内存至少10G以上,建议20G

如果你的 Kubernetes 环境满足以上的要求,那么可以接着执行下面的步骤了。

  1. 在master-k8s 节点安装kubeSphere
# 在Kubernetes 集群中创建名为 kubesphere-system 和 kubesphere-monitoring-system 的 namespace。
cat <<EOF | kubectl create -f -
---
apiVersion: v1
kind: Namespace
metadata:
    name: kubesphere-system
---
apiVersion: v1
kind: Namespace
metadata:
    name: kubesphere-monitoring-system
EOF
  1. 创建 Kubernetes 集群 CA 证书的 Secret。

注:按照当前集群 ca.crt 和 ca.key 证书路径创建(Kubeadm 创建集群的证书路径一般为 /etc/kubernetes/pki)

kubectl -n kubesphere-system create secret generic kubesphere-ca  \
--from-file=ca.crt=/etc/kubernetes/pki/ca.crt  \
--from-file=ca.key=/etc/kubernetes/pki/ca.key
  1. 创建集群 etcd 的证书 Secret。

注:根据集群实际 etcd 证书位置创建;

  • 若 etcd 已经配置过证书,则参考如下创建(以下命令适用于 Kubeadm 创建的 Kubernetes 集群环境):
kubectl -n kubesphere-monitoring-system create secret generic kube-etcd-client-certs  \
--from-file=etcd-client-ca.crt=/etc/kubernetes/pki/etcd/ca.crt  \
--from-file=etcd-client.crt=/etc/kubernetes/pki/etcd/healthcheck-client.crt  \
--from-file=etcd-client.key=/etc/kubernetes/pki/etcd/healthcheck-client.key
  • 若 etcd 没有配置证书,则创建空 Secret:
kubectl -n kubesphere-monitoring-system create secret generic kube-etcd-client-certs
  1. 克隆 kubesphere-installer 仓库至本地。
yum install git
git clone https://github.com/kubesphere/ks-installer.git
  1. 进入 ks-installer,然后在 Kubernetes 集群部署 KubeSphere。
cd deploy
# 根据参数说明列表,编辑 kubesphere-installer.yaml 中 ks-config.yaml 为当前集群参数信息(若 etcd 无证书,设置 etcd_tls_enable: False)
vim kubesphere-installer.yaml
kubectl apply -f kubesphere-installer.yaml
复制代码

修改kube_apiserver_hostetcd_endpoint_ips为机器的内网IP

apiversion:v1 data:
ks-config.yaml: |
kube_apiserver host: 172.18.24.217:6443 etcd tls enable: True
etcd_endpoint_ips: 172.18.24.217 disableMultiLogin: True elk_prefix: logstash persistence:
enable: false
storageClass:11 11
kind:ConfigMap metadata:
name:kubesphere-config
namespace:kubesphere-system
apiversion:v1
kind:ServiceAccount metadata:
name:ks-installer
namespace: kubesphere-system
apiVersion: rbac.authorization.k8s.io/v1 kind:ClusterRole
metadata: 
creationTimestamn: nul

可选安装项, 用不上的可以先禁用

4051ffbba49079ec61cbffe30664772.png

apiVersion:v1 data:
ks-config.yaml:|
kube_apiserver_host: 172.18.24.217:6443 etcd_tls_enable: True
etcd_endpoint_ips: 172.18.24.217 disableMultiLogin: True elk_prefix: logstash istio_enable: False persistence:
enable:false storageClass: kind:ConfigMap metadata:
name: kubesphere-config
namespace: kubesphere-system
apiversion:v1
kind:ServiceAccount
metadata: 
  1. 查看部署日志信息
kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l job-name=kubesphere-installer -o jsonpath='{.items[0].metadata.name}') -f
  1. 安装成功 安装成功执行以下命令查看状态
kubectl get svc -n kubesphere-system
[root@master2 deploy]# kubectl  get svc -n kubesphere-system  
NAME  TYPE  CLUSTER-IP  EXTERNAL-IP PORT(S) AGE 
ks-account  ClusterIp 10.96.83.179  <none>  80/TCP  5m18s 
ks-apigateway ClusterIP 10.96.142.34  <none>  80/TCP  5m14s 
ks-console  NodePort  10.96.227.217 <none>  80:30880/TCP  3m52s 
ks-docs ClusterIP 10.96.161.222 <none>  80/TCP  3m50s 
openldap  ClusterIP 10.96.161.168 <none>  389/TCP 6m21s 
redis Clusterip 10.96.230.34  <none>  6379/TCP  

使用 IP:30880 访问 KubeSphere UI 界面,默认的集群管理员账号为 admin/P@88w0rd

338468e46089ec3c5874658eab4c953.png

由于也是学习中,所以把环境也共享出来给大家体验以下==> 在线体验地址-账号为 test/Test123

小技巧

查看指定 namespace 下 pod 所属的 node 节点

kubectl get pods -n istio-system -o wide
[root@master2 deploy]# kubectl get pods -n istio-system wide  
NAME  READY STATUS  RESTARTS  AGE IP  NODE  NOMINATED NODE  READINESS GATES 
istio-citadel-df955d745-pt9q8 1/1 Running 27m 10.1  100.7.20  node3 <none>  <none>  
istio-galley-765d9c8dd5-4jpd4 1/1 Running 27m 10.1  100.7.9 node3 <none>  <none>  
istio-galley-765d9c8dd5-h97ck 1/1 Running 53m 10.1  100.6.136 nodel <none>  <none>  
1
istio-ingressgateway-6c5d44c4cd-4gfkq 日/1 Running 27m 10.1  100.7.18  node3 <none>  <none>  
istio-ingressgateway-6c5d44c4cd-z4kqn 0/1 Running 1 27m 10.1  100.7.16  node3 <none>  <none>  
istio-pilot-749bb54f8b-ng4nr  日/2 Pending 日 53m <non  he> <none>  <none>  <none>  
istio-pilot-749bb54f8b-nl2pb  日/2 Pending 27m <non  he> <none>  <none>  <none>  
istio-policy-6f6d5d69cd-fqgjs 2/2 Running 52m 10.1  00.6.139  nodel <none>  <none>  
istio-policy-6f6d5d69cd-jzs5n 2/2 Running 53m 10.1  100.6.132 nodel <none>  <none>  
istio-sidecar-injector-5798f7548-9tcb9  1/1 Running 2 27m 10.1  100.7.17  node3 <none>  <none>  
istio-telemetry-c84ff96f9-5dq26 日/2 Pending 53m <non  he> <none>  <none>  <none>  
istio-telemetry-c84ff96f9-xzcf4 2/2 Running 3 27m 10.1  100.7.7 node3 <none>  <none>  
jaeger-collector-7b7cbf9746-vrrk9 1/1 Running 27m 10.1  100.6.175 nodel <none>  <none>  
8 O
jaeger-operator-5544698bf8-kzh2b  1/1 Running 27m 10.1  100.6.180 nodel <none>  <none>  
root@master2 deploy]# jaeger-query-6c87996d76-wkw6p 2/2 Running 27m 10.1  100.6.177 nodel <none>  <none>  
# 查看dev下的pod
kubectl get pods -n dev
## 查看pod xxx的yaml文件
kubectl get pods -n dev xxx -o yaml
# 获取namespace 为dev 的pod详情
kubectl get pods -n dev -o wide
# 创建pod
kubectl apply -f xxx.yaml
# 显示node的labeal
kubectl get nodes --show-labels
# 查看 namespace为dev下的pod详情
kubectl describe pods -n dev [podName]
## 查看node节点详情
kubectl describe nodes [nodeName] -o wide

碰到 status为ContainerCreating ,可以到对应pod所在的node节点上执行journalctl -f查看镜像或容器实时状态

参考

helm安装

使用 kubeadm 安装 kubernetes v1.15.4

kubesphere source 安装指南


相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
2月前
|
Kubernetes Cloud Native 容器
完全免费的K8S学习平台:在线集群环境助力你的云原生之路!
完全免费的K8S学习平台:在线集群环境助力你的云原生之路!
168 1
|
2月前
|
Kubernetes Ubuntu Shell
wsl Ubuntu环境 创建 k8s集群
wsl Ubuntu环境 创建 k8s集群
|
2月前
|
JSON Kubernetes Linux
Linux环境签发CA证书和K8s需要的证书
Linux环境签发CA证书和K8s需要的证书
52 0
|
2月前
|
Kubernetes Java 测试技术
ChaosBlade常见问题之在K8s环境下演练cpu满载报错如何解决
ChaosBlade 是一个开源的混沌工程实验工具,旨在通过模拟各种常见的硬件、软件、网络、应用等故障,帮助开发者在测试环境中验证系统的容错和自动恢复能力。以下是关于ChaosBlade的一些常见问题合集:
101 0
|
2月前
|
存储 数据采集 Kubernetes
一文详解K8s环境下Job类日志采集方案
本文介绍了K8s中Job和Cronjob控制器用于非常驻容器编排的场景,以及Job容器的特点:增删频率高、生命周期短和突发并发大。文章重点讨论了Job日志采集的关键考虑点,包括容器发现速度、开始采集延时和弹性支持,并对比了5种采集方案:DaemonSet采集、Sidecar采集、ECI采集、同容器采集和独立存储采集。对于短生命周期Job,建议使用Sidecar或ECI采集,通过调整参数确保数据完整性。对于突发大量Job,需要关注服务端资源限制和采集容器的资源调整。文章总结了不同场景下的推荐采集方案,并指出iLogtail和SLS未来可能的优化方向。
|
6天前
|
Prometheus 监控 Kubernetes
深入理解Prometheus: Kubernetes环境中的监控实践
Kubernetes简介 在深入Prometheus与Kubernetes的集成之前,首先简要回顾一下Kubernetes的核心概念。Kubernetes是一个开源的容器编排平台,用于自动化容器的部署、扩展和管理。它提供了高度的可扩展性和灵活性,使得它成为微服务和云原生应用的理想选择。 核心组件 • 控制平面(Control Plane):集群管理相关的组件,如API服务器、调度器等。 • 工作节点(Nodes):运行应用容器的机器。 • Pods:Kubernetes的基本运行单位,可以容纳一个或多个容器。
|
3天前
|
消息中间件 Kubernetes Android开发
消息队列 MQ产品使用合集之如何在kubernetes环境里面部署
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
5天前
|
前端开发 Devops 测试技术
阿里云云效产品使用问题之更换所部署的环境关联的ACK集群该如何实现
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
2月前
|
域名解析 Kubernetes 网络协议
【域名解析DNS专栏】云原生环境下的DNS服务:Kubernetes中的DNS解析
【5月更文挑战第29天】本文探讨了Kubernetes中的DNS解析机制,解释了DNS如何将服务名转换为网络地址,促进集群内服务通信。Kubernetes使用kube-dns或CoreDNS作为内置DNS服务器,每个Service自动分配Cluster IP和DNS条目。通过示例展示了创建Service和使用DNS访问的流程,并提出了优化DNS解析的策略,包括使用高性能DNS解析器、启用DNS缓存及监控日志,以实现更高效、可靠的DNS服务。
|
2月前
|
存储 运维 Kubernetes
构建高效稳定的容器化运维环境:Docker与Kubernetes的协同
【4月更文挑战第14天】 在当今快速发展的云计算时代,容器技术以其轻量级、快速部署和易于管理的优势,成为现代应用交付的标准。本文将深入探讨如何通过Docker和Kubernetes的整合使用来构建一个高效且稳定的容器化运维环境。我们将分析Docker容器的基本概念,探索Kubernetes在容器编排方面的强大能力,以及两者结合所带来的益处。文章还将讨论在实际部署中可能遇到的挑战,并提出相应的解决方案。