Use Phicomm N1 install Kubernetes Cluster
手里面有两台斐讯N1,一台一直做TV盒子使用,另一台吃灰中,最近做TV盒子的那台播放电视家的时候,动不动就返回主页,同时,开启HDMI CEC后,尽管索尼的遥控器可以直接无缝匹配N1,但遥控起来轻飘飘的, 所以还是找出了吃灰中的小米盒子3拿来做TV盒子使用,然后将这两台N1安装armbian,尝试着安装kubernetes cluster,以下为详细安装步骤:
一、安装前准备
- N1机器,并安装Armbian,我这里安装的是 Armbian_5.77_Aml-s905_Ubuntu_bionic_default_5.0.2_20190401.img,都说稳定性好,U盘安装后并写入eMMC; 系统下载地址就不放了,网上有;安装armbian的步骤简单捋一下:
- 先制作Armbian U盘,Mac下直接使用dd命令即可,制作完后,重新挂载U盘,修改U盘下的uEnv.ini文件内的dtb文件路径(U盘目录下有N1的dtb文件,找到后修改即可)
- 降级N1系统并打开USB调试功能;
- adb 连接N1,并使用
adb shell reboot update
命令重启盒子,在盒子断电瞬间,拔掉电源线,然后插U盘(U盘插入靠近HDMI接口的那个上),不出意外的话应该就可以进入Armbian系统了; - root默认密码是1234,输入后会让你再次输入并连续两次输入新密码的操作来重置该root密码,在这一步你也可以选择添加一个普通用户来进行日常登录;
- 修改root目录下的install.sh权限,
chmod a+x install.sh
,然后执行nand-sata-install
命令来将系统写入eMMC,写入成功后reboot
下就可拔掉U盘了; - 如果在上述步骤时N1使用的有线网络连接,后续可直接使用ssh登录N1来进行后续步骤,不是的话需要在登录系统后,使用
armbian-config
命令来调试并连接Wi-Fi网络; - 网络连接后,使用root用户ssh登录系统,修改源,可以使用
armbian-config
命令来直接修改,并修改host名称,改完后,apt update && apt upgrade -y && apt autoremove -y
命令来一下,更新一下系统软件,若遇error错误 提示,重启下系统再次执行即可。
截止目前,我们对N1设备已安装来Armbian系统,并固定来IP地址,修改了主机名称,修改了软件源,更新了系统,差不多准备就结束了,开始下面的正式工作。
二、开始安装kunernetes 主节点软件
** 以下操作均在主节点机器上执行,可暂时将另一台主机关闭 ** * 修改hosts文件(/etc/hosts),在hosts内添加IP地址信息与主机名称对应信息,如:
127.0.0.1 locahost,host-m
192.168.0.100 locahost,host-m
192.168.0.101 host-02
配置设置docker的cgroup-driver为systemd,创建
/etc/docker/daemon.json
文件,文件内容如下:{ "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2" }
完成后保存,接着执行
sudo systemd daemon-reload
命令来重载,如果机器已经安装docker了,重启docker(sudo systemctl restart docker
)配置kubelet的cgroup-driver为systemd,同时需要关闭swap,但是,Armbian使用的是zram,不建议关闭,所以创建
/etc/default/kubelet
,内容如下:KUBELET_EXTRA_ARGS=--cgroup-driver=systemd --fail-swap-on=false
ps:kubelet在启动时,会检测cgroup-driver的参数选项,要求均一致,所以在kubelet启动后,如果启动失败,可以通过启动日志查看原因;
安装docker,kubeadm,kubelet,kubectl
apt install -y docker.io kubeadm kubelet kubectl
*** 暂不考虑网络,假设网络非常好,我是在那啥路由器下操作的 *** 安装完成后,继续往下走。。。
初始化k8s集群
初始化命令
sudo kubeadm init
,但因为swap没有关闭,所以还需要添加一个选项:--ignore-preflight-errors Swap
,所以完整的是:sudo kubeadm init --ignore-preflight-errors Swap
初始化成功后,可以看到类似的提示消息: ``` 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
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:
kubeadm join 192.168.1.200:6443 –token gffngy.ihk640zujif06483
–discovery-token-ca-cert-hash sha256:367fc272849a3786d741e2056db6336b4ac7c643e05a030e33f9e5157603b9e1
然后可以通过以下命令查看集群信息:
sama@host-m:~$ sudo kubectl cluster-info //获取集群信息 Kubernetes master is running at https://192.168.1.200:6443 KubeDNS is running at https://192.168.1.200:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use ‘kubectl cluster-info dump’.
sama@host-m:~$ sudo kubectl get nodes //获取节点 NAME STATUS ROLES AGE VERSION host-m Ready master 39h v1.18.8
sama@host-m:~$ sudo kubectl get pods –all-namespaces //获取所有namespaces的pod
在该步骤可能会出现问题,我把我遇到的问题列下来,如遇到可做参考:
1. `The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get http://localhost:10248/healthz: dial tcp 127.0.0.1:10248: connect: connection refused.`
类似如下信息:
[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory “/etc/kubernetes/manifests”. This can take up to 4m0s [kubelet-check] Initial timeout of 40s passed. [kubelet-check] It seems like the kubelet isn’t running or healthy. [kubelet-check] The HTTP call equal to ‘curl -sSL http://localhost:10248/healthz' failed with error: Get http://localhost:10248/healthz: dial tcp 127.0.0.1:10248: connect: connection refused. [kubelet-check] It seems like the kubelet isn’t running or healthy. [kubelet-check] The HTTP call equal to ‘curl -sSL http://localhost:10248/healthz' failed with error: Get http://localhost:10248/healthz: dial tcp 127.0.0.1:10248: connect: connection refused.
使用`sudo systemctl status kubectl` 查看`kubectl`的状态,发现:
● kubelet.service - kubelet: The Kubernetes Node Agent Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled) Drop-In: /usr/lib/systemd/system/kubelet.service.d └─10-kubeadm.conf Active: activating (auto-restart) (Result: exit-code) since Thu 2020-08-26 17:44:39 CST; 2s ago Docs: https://kubernetes.io/docs/ Process: 14476 ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS (code=exited, status=255) Main PID: 14476 (code=exited, status=255)
Mar 28 09:44:39 k8s-node systemd[1]: kubelet.service: main process exited, code=exited, status=255/n/a
状态为`activating`,没有起来。Google一下,让检查`native-cgroupdriver`,所以我们查看一下下面几个地方:
sama@host-m:~$ sudo cat /var/lib/kubelet/kubeadm-flags.env KUBELET_KUBEADM_ARGS=“–cgroup-driver=systemd –network-plugin=cni –pod-infra-container-image=k8s.gcr.io/pause:3.2 –resolv-conf=/run/systemd/resolve/resolv.conf”
sama@host-m:~$ sudo cat /etc/default/kubelet KUBELET_EXTRA_ARGS=–cgroup-driver=systemd –fail-swap-on=false
sama@host-m:~$ docker info Client: Debug Mode: false
Server: …… Logging Driver: json-file Cgroup Driver: systemd Plugins: Volume: local ……
看配置里的 `Cgroup Driver` 的值是否一致,不一致的话修改上述说明中的两处配置文件。
2. Kubelet启动报错:node "node-m" not found
类似如下提示:
sama@host-m# sudo systemctl status kubelet -l
● kubelet.service - kubelet: The Kubernetes Node Agent ……
Aug 26 17:39:16 master kubelet[6161]: E0731 05:39:16.008683 6161 kubelet.go:2248] node “node-m” not found Aug 26 17:39:16 master kubelet[6161]: E0731 05:39:16.109488 6161 kubelet.go:2248] node “node-m” not found Aug 26 17:39:16 master kubelet[6161]: E0731 05:39:16.210368 6161 kubelet.go:2248] node “node-m” not found
先检查`kubelet.conf`的配置文件,查看配置中的地址是否为正确地址:
` sama@host-m# sudo cat /etc/kubernetes/kubelet.conf`
若以上地址正确,检查`/etc/hosts`内主机名称是否对应一致。若均无毛病,直接重启该设备后查看启动是否正常。
若地址不正确,需要修改一下几个配置文件:`/etc/kubernetes/admin.conf`,`/etc/kubernetes/controller-manager.conf`,`/etc/kubernetes/kubelet.conf`,`/etc/kubernetes/scheduler.conf`
`journalctl -xeu kubelet` 命令可以查看kubelet的日志。
## 安装flannel
Flannel is a simple and easy way to configure a layer 3 network fabric designed for Kubernetes.
1.安装前修改`/etc/kubernetes/manifests/kube-controller-manager.yaml`文件,添加两处参数,详细如下:
sama@host-m:~$ sudo cat /etc/kubernetes/manifests/kube-controller-manager.yaml [sudo] password for sama: apiVersion: v1 kind: Pod metadata: creationTimestamp: null labels: component: kube-controller-manager tier: control-plane name: kube-controller-manager namespace: kube-system spec: containers: - command: - kube-controller-manager - –authentication-kubeconfig=/etc/kubernetes/controller-manager.conf - –authorization-kubeconfig=/etc/kubernetes/controller-manager.conf - –bind-address=127.0.0.1 - –client-ca-file=/etc/kubernetes/pki/ca.crt - –cluster-name=kubernetes - –cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt - –cluster-signing-key-file=/etc/kubernetes/pki/ca.key - –controllers=*,bootstrapsigner,tokencleaner - –kubeconfig=/etc/kubernetes/controller-manager.conf - –leader-elect=true - –port=0 - –requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt - –root-ca-file=/etc/kubernetes/pki/ca.crt - –service-account-private-key-file=/etc/kubernetes/pki/sa.key - –use-service-account-credentials=true - –allocate-node-cidrs=true //新添内容 - –cluster-cidr=10.244.0.0/16 //新添内容
2. 安装使用如下命令,最新版怼起来,
`kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml`
## 安装kubernetes-dashboard WebUI插件
### 安装
官方安装命令:
`kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml`
但这样安装有点问题:
1. 安装完后证书原因,除firfox浏览器外,其他浏览器均无法打开;
这个我按照官方说明,使用自签证书依旧无法解决,所以暂时使用火狐浏览器访问。
2. 安装完成后,kubernetes-dashboard service 在集群内部,无法再外部访问,需要将dashboard的443端口暴露出来,所以有四种方法:
- 第一方法:上面的`kubernetes-dashboard.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 nodePort: 31111 //新加内容 selector: k8s-app: kubernetes-dashboard
……
然后保存,再使用`kubectl apply -f kubernetes-dashboard.yaml`来进行安装;
- 第二种方法:在使用`kubectl apply -f 在线yaml地址`完成安装后,使用以下命令`kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard`来修改已运行的配置,
找到type字段,将ClusterIP修改为NodePort,wq保存后,可使用`kubectl get svc -n kubernetes-dashboard`来进行查看结果。
两种方法各有利弊,比如说安装失败需要重新调试参数时,第一种方法最合适,而且第二种方式所添加的端口不固定,需要使用`kubectl get svc`查看后才可以知晓端口。
- 第三种方法:使用` kubectl -n kubernetes-dashboard port-forward ${dashboard-pod-name} 31111:8443`,该方法应该可行,在后续的其他pod上使用该方法。
- 第四种方法:proxy,使用命令`sudo kubtctl proxy`,然后访问`http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/`;
### 登录
需要创建dashboard用户
1. 创建服务账户文件,我命名为`admin-sa.yml`,内容如下:
apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kubernetes-dashboard
保存后,使用`sudo kubectl apply -f admin-sa.yml`来创建对象;
2. 创建集群规则绑定,我命名为`admin-rbac.yml`,内容如下:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: admin-user roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: admin-user namespace: kubernetes-dashboard
保存后,使用`sudo kubectl apply -f admin-rbac.yml`命令来创建该规则。
3. 使用` sudo kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')`命令来获取该用户的token:
sama@host-m:~$ sudo kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk ‘{print $1}’)
Name: admin-user-token-gj8cb
Namespace: kubernetes-dashboard
Labels:
Type: kubernetes.io/service-account-token
Data
ca.crt: 1025 bytes namespace: 20 bytes token: eyJhbGciOiJSUzI1NiIsImtpZCI6IlNBdlVaY0d3NHVQRldKRUFGZ1VJRjhWOG1NUkNmV2gwelBaVy1xdS1mTk0ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLWdqOGNiIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIyOWU0NDZlYi03NzczLTQyOGQtYmViNi0yZTlkYzU4NTBiMDUiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.AoA91kavZ_CrNp0gzpLagRAKDYml2nP1Eiumd_k0tBlPmbtZD1dN3GNoVFbaSjJm3omZReZ6qq3l-t7r6gWPg88WhAxHCQlWVz0AgwPVQvRGFNE4rHQHaCdqzvn5Hyk0i7W62_NHhvM8VWln-hfpPGKNvxho6hT3HdD2u22bX-F32NOKR15zu7N3MTXeaMflL3nbyzn6DSWlGHHTe1428LMXmPZZQjO7QEyVbh8mK6KxumncGgs6sTw8ubXvTG7fKS32Ydr69Q7NuGWCbstkEkfeH72gvXk79HXycqx32HZqoklZfNdmYehRSxLauTfzbYUPJZulma1zw3-sQ_sTyQ
然后使用该token值就可登录dashboard的UI界面了,权限正常。
![dashboard界面](https://res.cloudinary.com/samawong/image/upload/v1598600528/notes/k8s-install/ui_x8ctug.jpg "dashboard界面")
## 节点加入集群
节点主机依照上述文档,固定IP地址,修改主机名,修改hosts文件,apt update && apt upgrade,就可以安装docker,kubeadm,kubectl,kubelet了。
安装完后使用主节点`sudo kubeadm init`命令生成的`sudo kubeadm join 192.168.1.200:6443 --token gffngy.ihk640zujif06483 \
--discovery-token-ca-cert-hash sha256:367fc272849a3786d741e2056db6336b4ac7c643e05a030e33f9e5157603b9e1 `来加入主节点。
添加成功后,可以在主节点的dashboard内可看到该节点,命令下也可以:
sama@host-m:~$ sudo kubectl get nodes
NAME STATUS ROLES AGE VERSION
host-m Ready master 43h v1.18.8
host-s Ready
上述两台主机的VERSION不一致,host-s比host-m迟一天,正好这天发布了最新的V1.19版,暂时看版本不一致兼容没有问题。
如果上述命令的token忘记了,可以使用`sudo kubeadm token list`来获取token,默认,token有效期24h,如果没有token已过期,你可以使用
`sudo kubeadm token create`来创建一个,比如如下样子:
sama@host-m:~$ sudo kubeadm token create 1azhxq.rbnzt28euxspwjdj
若没有后面`--discovery-token-ca-cert-hash`的值,可以使用如下命令来获取:
sama@host-m:~$ sudo openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null |
> openssl dgst -sha256 -hex | sed ’s/^.* //’
367fc272849a3786d741e2056db6336b4ac7c643e05a030e33f9e5157603b9e1
## Helm 包管理工具
+ 安装版本
sama@host-m:~$ helm version version.BuildInfo{Version:“v3.3.0”, GitCommit:“8a4aeec08d67a7b84472007529e8097ec3742105”, GitTreeState:“dirty”, GoVersion:“go1.14.7”}
+ 安装方式:
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 -o get_helm.sh && sudo chmod +x get_helm.sh && sudo ./get_helm.sh
+ 使用:
` helm create hello-helm ` //创建名为hello-helm的Chart
` helm install helm-example hello-helm ` //使用hello-helm来安装一个名为helm-example的应用,如下所示:
sama@host-m:~$ helm install helm-example hello-helm NAME: helm-example LAST DEPLOYED: Fri Aug 28 14:24:30 2020 NAMESPACE: default STATUS: deployed REVISION: 1 NOTES: 1. Get the application URL by running these commands: export POD_NAME=$(kubectl get pods –namespace default -l “app.kubernetes.io/name=hello-helm,app.kubernetes.io/instance=helm-example” -o jsonpath=“{.items[0].metadata.name}“) echo “Visit http://127.0.0.1:8080 to use your application” kubectl –namespace default port-forward $POD_NAME 8080:80
根据上述提示,执行下面的命令:
sama@host-m:~$ export POD_NAME=$(kubectl get pods –namespace default -l “app.kubernetes.io/name=hello-helm,app.kubernetes.io/instance=helm-example” -o jsonpath=“{.items[0].metadata.name}“) sama@host-m:~$ kubectl –namespace default port-forward $POD_NAME 8080:80 Forwarding from 127.0.0.1:8080 -> 80 Forwarding from [::1]:8080 -> 80 ``` 然后在浏览器内输入http://127.0.0.1:8080,可以访问我们刚新建的chart了。(N1没有浏览器,所以,两个窗口,curl来一下)
其他命令请参阅helm官网.
部分常用命令
- kubectl replace –force -f kubernetes-dashboard-arm64.yaml //重新导入yaml配置,可作为集群重启pod方式
- kubectl get pods –all-namespaces //获取所有pod列表
- kubectl -n
get/edit/delete pod (pod-name) //获取该namespace下pod列表 - kubectl -n
get/edit svc (pod-name) //获取该namespace下网络情况 - kubectl describe pod (pod-name) -n
//获取该namespace 下(pod)信息 - kubectl logs -n
(pod-name) //获取该namespace下pod-name的日志
至此,k8s的集群简易说明到此结束。
参考链接: 1. How To Create Admin User to Access Kubernetes Dashboard 2. kubernetes/dashboard 3. user/access-control/creating-sample-user.md 4. Kubernetes Dashboard的安装与坑 5. v1.14.0 problem : It seems like the kubelet isn’t running or healthy 6. 安装笔记K8S 1.15.0版本遇到的一些错误汇总(部分参考网络上经验,基本可以解决问题) 7. Kubernetes 部署失败的 10 个最普遍原因(Part 1) 8. 构建 arm64 架构 k8s 集群(phicomm-n1) 9. Creating a cluster with kubeadm 10. Unable to update cni config: No networks found in /etc/cni/net.d 11. 重启 Kubernetes Pod的几种方式 12. helm/helm