k8s学习(一)
k8s学习(一)
安装
升级docker for desktop的mac版本到
https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
** unbuntu环境安装
1. 使用kubeadm安装kubectl
vim /etc/docker/daemon.json
export PS1=”[\033[33m]\u[\033[0m]@[\033[36m]k8s[\033[0m]:[\033[32m]\W [\033[0m]$ “
apt -y install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add -
curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
设置墙内镜像地址
cat <<EOF >/etc/apt/sources.list.d/docker-k8s.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable
EOF
cat <<EOF >/etc/apt/sources.list.d/docker-k8s.list
deb http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial main
EOF
安装docker-ce kubelet kubeadm kubectl
apt update && apt install -y docker-ce kubelet kubeadm kubectl
systemctl enable kubelet && systemctl start kubelet
** 禁用swapp
sudo swapoff -a
** 要永久禁掉swap分区,打开如下文件注释掉swap那一行
sudo vi /etc/fstab
摘取镜像
kubeadm config images list
初始化
kubeadm init --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=NumCPU
设置master主机名
sudo hostnamectl set-hostname kubemaster
systemctl kubelet status
systemctl start kubelet
systemctl kubelet status
systemctl enable kubelet && systemctl start kubelet
这个方式如果是个人测试与学习用,安装比较复杂,并且浪费时间,建议使用minikube
- minikube
- 需要安装kubectl
最新的minikue不需要再安装kebectl环境了,因为经常由于版本不匹配问题,导致minikube安装不成功,奶奶的
2. MiniKube 安装
MiniKube 是使用 Go 语言开发的,所以安装其实很方便,一是通过下载基于不同平台早已编译好的二级制文件安装,二是可以编译源文件安装。
curl -Lo minikube http://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/releases/v1.12.1/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
- 启动minikube
minikube start –vm-driver=none –registry-mirror=https://registry.docker-cn.com
minikube status
遇到的问题:
# sudo systemctl enable kubelet
Failed to enable unit: Unit file /etc/systemd/system/kubelet.service is masked.
出现这种情况,执行:
kubelet --version
有反应,说明kubelet安装成功,只是环境变量有问题。
解决办法:
# sudo rm /etc/systemd/system/kubelet.service
root@kubenode:/etc/systemd/system# rm -rf kubelet.service.d/10-kubeadm.conf
重新加载系统配置:
sudo systemctl daemon-reload
查看状态:
sudo systemctl status kubelet
启动成功:
root@kubenode:/etc/systemd/system# sudo systemctl status kubelet
● kubelet.service - kubelet: The Kubernetes Node Agent
Loaded: loaded (/lib/systemd/system/kubelet.service; enabled; vendor preset: enabled)
Active: inactive (dead)
Docs: http://kubernetes.io/docs/
root@kubenode:/etc/systemd/system# sudo systemctl start kubelet
root@kubenode:/etc/systemd/system# sudo systemctl status kubelet
● kubelet.service - kubelet: The Kubernetes Node Agent
Loaded: loaded (/lib/systemd/system/kubelet.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2020-07-27 18:43:06 CST; 6s ago
Docs: http://kubernetes.io/docs/
Main PID: 23171 (kubelet)
全局启动:
sudo systemctl enable kubelet
sudo systemctl is-enabled kubelet
查看是否启动,返回:
enabled
启动minikube的时候,老是遇到端口被占用
原因是:localkube,kubectl, kubelet在外面启动了,应该不要启动
关闭
sudo systemctl stop localkube
sudo systemctl stop kubelet
再执行:
启动minkiube:
minikube start --vm-driver=none
查看状态:
看看之前禁用掉的两个服务:
mac环境
- docker desk
docker-for-desktop
版本:2.3.0.4(46911)
docker engine: 19.03.12
compose: 1.26.2
k8s: v1.16.5
安装后遇到的问题
开启k8s后,docker desk 界面一直在转:
https://juejin.im/post/5d87980f5188253f74438bb6
安装dashboard
因文件中镜像在国内无法下载,使用如下镜像代替:
docker pull gcrxio/kubernetes-dashboard-amd64:v1.10.1
下载完后改成文件中的名字(k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1):
启动代理:
kubectl proxy
启动成功后,可以通过该地址进行访问 Dashboard:
http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
进入 Dashboard 需要令牌,可以通过以下命令获取令牌:
- minikube
安装:
##dashboard password:
kubectl -n kube-system describe secret default| awk ‘$1==”token:”{print $2}’\n
验证kubectl集群配置
在本地创建多节点kubenet
- 查看当前所在集群信息
查看集群的node数
启动dashboard
启动后会自动打开浏览器访问dashboard的地址:
本机只有一个节点,我要模拟多个节点
因为minikube添加节点会自动加入到当前集群中,而且会自动命名:
- 查看集群中节点数目
ps: roles没有设置,暂时也不知道怎么设置
在dashboard中也可以看到新加的nodes:
部署应用
由于我已经有两个节点了,那我部署应用应该至少设置2个及以上的pod数量
创建Node.js应用程序
下一步编写应用程序。将这段代码保存在一个名为hellonode的文件夹中,文件名server.js:
server.js
运行应用:
返回:hello world !
按Ctrl-C停止正在运行的Node.js服务器。
下一步将应用程序打包到Docker容器中。
创建Docker容器镜像
在hellonode文件夹中创建一个Dockerfile命名的文件。Dockerfile描述了build的镜像,通过现有的镜像扩展(extend)build Docker容器镜像,本教程中的镜像扩展(extend)了现有的Node.js镜像。
本教程使用Minikube,而不是将Docker镜像push到registry,可以使用与Minikube VM相同的Docker主机构建镜像,以使镜像自动存在。为此,请确保使用Minikube Docker守护进程:
注意:如果不在使用Minikube主机时,可以通过运行eval $(minikube docker-env -u)来撤消此更改。
使用Minikube Docker守护进程build Docker镜像:
好了Minikube VM可以运行构建好的镜像。
由于我是在本地构建的image,所以为了防止在其它的node上重复下载image或者下载不到image,则执行镜像拉取:
但是这种方式有问题,新建一个node,部署的时候,还是报错:
在部署应用之前,我有两个节点,一个master一个node,但是master不承担应用节点负载,那么我再建立一个node:
生成了minikube-m03
下载完了以后,部署一个deployment:
kubectl run hello-node –image=hello-node:v1 –port=8888 –replicas=6
只能先用笨办法,进入node节点机器,将镜像手动再build一下:
minikube ssh -n minikube-m03
由于在国内,因为墙的原因,新增的node节点无法下载镜像,则需要在启动minikube的时候,加上镜像地址:
创建Service
默认情况,Pod只能通过Kubernetes群集内部IP访问。要使hello-node容器从Kubernetes虚拟网络外部访问,须要使用Kubernetes Service暴露Pod。(理论上就算用service暴露pod,也只能在kubectl内部的服务去访问)
我们可以使用kubectl expose命令将Pod暴露到外部环境:
查看刚创建的Service:
输出:
将此service临时暴露出来,让宿主机可以访问:
将打开浏览器,在本地IP地址为应用提供服务,显示“Hello World”的消息。
最后可以查看到一些日志
[参考文章]: (https://kubernetes.io/docs/tasks/access-application-cluster/ingress-minikube “)”
[例子参考]: http://docs.kubernetes.org.cn/94.html
http://docs.kubernetes.org.cn/94.html
ingressCntroller+ ingress+web
开启minikube的ingressController插件
我们有些后台服务是直接在外网上被调用的,比如给h5或者app提供服务的应用,
在minikube上已经集成了ingressController。
只要启动的时间加上–driver=hyperkit (这个是在mac上提示这样写的,但实际上无效,不支持开启插件)
ps: 在mac平台下,minikube有个bug, 是不会成功的。
只能切换到unbuntu上运行:
ps: 目前这个是不可以的的
问题已经在github上暴露出来了:
https://github.com/kubernetes/minikube/pull/7393
https://kubernetes.io/docs/tasks/access-application-cluster/ingress-minikube/
验证ingressController是否开启成功
返回:
NAME READY STATUS RESTARTS AGE
coredns-546565776c-z5h75 1/1 Running 0 39m
etcd-kubenode 1/1 Running 0 39m
ingress-nginx-admission-create-x2rss 0/1 Completed 0 7m14s
ingress-nginx-admission-patch-kzj24 0/1 Completed 1 7m14s
ingress-nginx-controller-69ccf5d9d8-j5qnj 1/1 Running 0 7m14s
kube-apiserver-kubenode 1/1 Running 0 39m
kube-controller-manager-kubenode 1/1 Running 0 39m
kube-proxy-kdgpn 1/1 Running 0 39m
kube-scheduler-kubenode 1/1 Running 0 39m
storage-provisioner 1/1 Running 0 39m
配置ingress rule
example-ingress.yaml:
- ```shell
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:- host: hello.node.info
http:
paths:- path: /
backend:
serviceName: hello-node
servicePort: 8888
- path: /
- host: hello.node.info
- ```shell
或者从github下载源码包:
https://github.com/kubernetes/ingress-nginx/releases/tag/controller-v0.34.1
下载下来,找到deploy.yaml文件:
注意,官网上它发布了两种包:
- ingress-nginx-xxx 必须结合helm才能部署执行
- controller-v034.1 是源包
2.下载镜像:
因为deploy.yaml里的镜像地址,国内因为墙的原因,无法访问,所以我们将它的镜像地址改成阿里云的镜像地址:
ps: 因为阿里云没有0.34.1这个版本,所以换成了0.30.0
ps: 找到了国内可以用的0.34镜像:
- 启动ingressController
将deploy.yaml 改名:ingress-nginx-controller.yaml
查看是否启动成功:
有两个adminssion没有启动,只是镜像下载完成了,我们看看什么原因:
事件日志:
这个至于为什么,我暂时没找到解决办法,但这个pod不影响我们ingress-controller的正常运行,先不管了。
我们看看ingress-controller 的service是否正常:
发现已经解析到本机的localhost了。
我们看看:
curl localhost
我们因为之前已经部署了hello-node的pod服务,我们看看ingress是否生效:
发现已经将我们自定义的host指向了address地址,我们访问看看:
负载均衡已经起效。
参考文章
https://kubernetes.io/docs/tasks/access-application-cluster/ingress-minikube/
https://kubernetes.github.io/ingress-nginx/deploy/
更新镜像与服务
更新应用程序
编辑server.js文件以返回pod容器的ip:
完整server.js:
build新版本镜像
Deployment更新镜像:
再次运行应用以查看新消息:
清理删除
现在可以删除在集群中创建的资源:
或者停止Minikube: