学习k8s,但是安装k8s实在太麻烦了,也耗费了不少时间,下面来说说安装步骤。以下是我的机器配置,其实2核4G也可以,但是因为我想学习下kubeSphere就要求配置高了,我在这上面也耗费了不少时间,鄙人特将学习过程记录下来,希望各位看官给个赞,码字不易,越看越有劲。
第一步-修改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 环境满足以上的要求,那么可以接着执行下面的步骤了。
- 在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
- 创建 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
- 创建集群 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
- 克隆 kubesphere-installer 仓库至本地。
yum install git git clone https://github.com/kubesphere/ks-installer.git
- 进入 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_host
和etcd_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
可选安装项, 用不上的可以先禁用
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:
- 查看部署日志信息
kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l job-name=kubesphere-installer -o jsonpath='{.items[0].metadata.name}') -f
- 安装成功 安装成功执行以下命令查看状态
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
由于也是学习中,所以把环境也共享出来给大家体验以下==> 在线体验地址-账号为 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
查看镜像或容器实时状态
参考
使用 kubeadm 安装 kubernetes v1.15.4