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在外面启动了,应该不要启动
关闭
systemctl list-unit-files --state=enabled | grep kube | awk '{ print $1 }' | xargs systemctl disable
apt update -y && apt upgrade -y && reboot
sudo systemctl stop localkube
sudo systemctl stop kubelet
再执行:
systemctl enable kubelet.service
systemctl enable localkube.service
启动minkiube:
minikube start --vm-driver=none
查看状态:
看看之前禁用掉的两个服务:
systemctl list-unit-files --state=enabled | grep kube | awk '{ print $1 }'
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
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
因文件中镜像在国内无法下载,使用如下镜像代替:
docker pull gcrxio/kubernetes-dashboard-amd64:v1.10.1
下载完后改成文件中的名字(k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1):
docker tag 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 需要令牌,可以通过以下命令获取令牌:
kubectl -n kube-system describe secret default| awk '$1=="token:"{print $2}'
- minikube
安装:
curl -Lo minikube http://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/releases/v1.12.1/minikube-darwin-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
##dashboard password:
kubectl -n kube-system describe secret default| awk ‘$1==”token:”{print $2}’\n
验证kubectl集群配置
kubectl cluster-info
在本地创建多节点kubenet
- 查看当前所在集群信息
kubectl cluster-info
查看集群的node数
kubectl get nodes
启动dashboard
minikube dashboard
启动后会自动打开浏览器访问dashboard的地址:
本机只有一个节点,我要模拟多个节点
minikube node add
因为minikube添加节点会自动加入到当前集群中,而且会自动命名:
- 查看集群中节点数目
kubectl get nodes
ps: roles没有设置,暂时也不知道怎么设置
在dashboard中也可以看到新加的nodes:
部署应用
由于我已经有两个节点了,那我部署应用应该至少设置2个及以上的pod数量
创建Node.js应用程序
下一步编写应用程序。将这段代码保存在一个名为hellonode的文件夹中,文件名server.js:
server.js
var http = require('http');
var handleRequest = function(request, response) {
console.log('Received request for URL: ' + request.url);
response.writeHead(200);
response.end('Hello World!');
};
var www = http.createServer(handleRequest);
www.listen(8888);
运行应用:
node server.js
返回:hello world !
按Ctrl-C停止正在运行的Node.js服务器。
下一步将应用程序打包到Docker容器中。
创建Docker容器镜像
在hellonode文件夹中创建一个Dockerfile命名的文件。Dockerfile描述了build的镜像,通过现有的镜像扩展(extend)build Docker容器镜像,本教程中的镜像扩展(extend)了现有的Node.js镜像。
FROM node:10.16.3
EXPOSE 8888
COPY server.js .
CMD node server.js
本教程使用Minikube,而不是将Docker镜像push到registry,可以使用与Minikube VM相同的Docker主机构建镜像,以使镜像自动存在。为此,请确保使用Minikube Docker守护进程:
eval $(minikube docker-env)
注意:如果不在使用Minikube主机时,可以通过运行eval $(minikube docker-env -u)来撤消此更改。
使用Minikube Docker守护进程build Docker镜像:
docker build -t hello-node:v1 .
好了Minikube VM可以运行构建好的镜像。
由于我是在本地构建的image,所以为了防止在其它的node上重复下载image或者下载不到image,则执行镜像拉取:
docker save hello-node:v1 | (eval $(minikube docker-env) && docker load)
但是这种方式有问题,新建一个node,部署的时候,还是报错:
在部署应用之前,我有两个节点,一个master一个node,但是master不承担应用节点负载,那么我再建立一个node:
minikube node add
生成了minikube-m03
下载完了以后,部署一个deployment:
kubectl run hello-node –image=hello-node:v1 –port=8888 –replicas=6
只能先用笨办法,进入node节点机器,将镜像手动再build一下:
minikube ssh -n minikube-m03
由于在国内,因为墙的原因,新增的node节点无法下载镜像,则需要在启动minikube的时候,加上镜像地址:
minikube start --registry-mirror=http://917ad9c3.m.daocloud.io,https://1nrb7s9c.mirror.aliyuncs.com,https://docker.mirrors.ustc.edu.cn --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers
创建Service
默认情况,Pod只能通过Kubernetes群集内部IP访问。要使hello-node容器从Kubernetes虚拟网络外部访问,须要使用Kubernetes Service暴露Pod。(理论上就算用service暴露pod,也只能在kubectl内部的服务去访问)
我们可以使用kubectl expose命令将Pod暴露到外部环境:
kubectl expose deployment hello-node --type=LoadBalancer
查看刚创建的Service:
kubectl get services
输出:
将此service临时暴露出来,让宿主机可以访问:
minikube service hello-node
将打开浏览器,在本地IP地址为应用提供服务,显示“Hello World”的消息。
最后可以查看到一些日志
kubectl logs <POD-NAME>
[参考文章]: (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。
minikube addons enable ingress
只要启动的时间加上–driver=hyperkit (这个是在mac上提示这样写的,但实际上无效,不支持开启插件)
ps: 在mac平台下,minikube有个bug, 是不会成功的。
只能切换到unbuntu上运行:
minikube start --registry-mirror=http://917ad9c3.m.daocloud.io,https://1nrb7s9c.mirror.aliyuncs.com,https://docker.mirrors.ustc.edu.cn --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --driver=none
ps: 目前这个是不可以的的
问题已经在github上暴露出来了:
https://github.com/kubernetes/minikube/pull/7393
https://kubernetes.io/docs/tasks/access-application-cluster/ingress-minikube/
验证ingressController是否开启成功
kubectl get pods -n kube-system
返回:
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:
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
里面配置了一个指向规则,host:hello.node.info —-> backend:hello-node:8888
查看ingress相关信息:
kubectl get ingress
返回:
hello.node.info这个域名是我自定义的,需要在访问的客户端里设置hosts,由于我是用的minikube安装的kubectl,我只要在客户端机器映射宿主机ip地址就行了.
hosts:
10.105.242.61 hello.node.info
现在大功告成了!!!
注意事项
我有两套本地环境:
- mac os 10.15.6 Beta版
- docker for desk
- minikube
- unbuntu 18.03
- minikube+kubadm
不管是mac环境还是unbuntu环境,都对多节点模式支持不到位
mac: 可以多节点操作,但多节点镜像共享有bug,不支持minikube的ingresscontroller插件
linux: 不支持本地多节点,支持minikube的ingresscontroller插件
docker desk for mac 安装ingressController
- 从官网下载deployment的yaml文件
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.34.1/deploy/static/provider/cloud/deploy.yaml
或者从github下载源码包:
https://github.com/kubernetes/ingress-nginx/releases/tag/controller-v0.34.1
下载下来,找到deploy.yaml文件:
/Users/sam/Downloads/ingress-nginx-controller-v0.34.1/deploy/static/provider/kind
注意,官网上它发布了两种包:
- ingress-nginx-xxx 必须结合helm才能部署执行
- controller-v034.1 是源包
2.下载镜像:
因为deploy.yaml里的镜像地址,国内因为墙的原因,无法访问,所以我们将它的镜像地址改成阿里云的镜像地址:
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:0.30.0
ps: 因为阿里云没有0.34.1这个版本,所以换成了0.30.0
ps: 找到了国内可以用的0.34镜像:
docker pull siriuszg/nginx-ingress-controller:v0.34.1
- 启动ingressController
将deploy.yaml 改名:ingress-nginx-controller.yaml
kubectl apply -f ingress-nginx-controller.yaml
查看是否启动成功:
kubectl get pods -n ingress-nginx \\n -l app.kubernetes.io/name=ingress-nginx --watch
有两个adminssion没有启动,只是镜像下载完成了,我们看看什么原因:
kubectl describe pod ingress-nginx-admission-patch-trcxc -n ingress-nginx
事件日志:
这个至于为什么,我暂时没找到解决办法,但这个pod不影响我们ingress-controller的正常运行,先不管了。
我们看看ingress-controller 的service是否正常:
kubectl get service -n ingress-nginx
发现已经解析到本机的localhost了。
我们看看:
curl localhost
我们因为之前已经部署了hello-node的pod服务,我们看看ingress是否生效:
kubectl get ingress
发现已经将我们自定义的host指向了address地址,我们访问看看:
负载均衡已经起效。
参考文章
https://kubernetes.io/docs/tasks/access-application-cluster/ingress-minikube/
https://kubernetes.github.io/ingress-nginx/deploy/
更新镜像与服务
更新应用程序
编辑server.js文件以返回pod容器的ip:
response.end('Hello World!'+'_'+ getIPAdress());
完整server.js:
var http = require('http');
var handleRequest = function(request, response) {
console.log('Received request for URL: ' + request.url);
response.writeHead(200);
response.end('Hello World!'+'_'+ getIPAdress());
};
var www = http.createServer(handleRequest);
www.listen(8888);
function getIPAdress() {
let interfaces = require('os').networkInterfaces();
for (var devName in interfaces) {
var iface = interfaces[devName];
for (var i = 0; i < iface.length; i++) {
let alias = iface[i];
if (alias.family === 'IPv4' && alias.address !== '127.0.0.1' && !alias.internal) {
console.log(alias.address);
return alias.address;
}
}
}
}
build新版本镜像
docker build -t hello-node:v2 .
Deployment更新镜像:
kubectl set image deployment/hello-node hello-node=hello-node:v2
再次运行应用以查看新消息:
minikube service hello-node
清理删除
现在可以删除在集群中创建的资源:
kubectl delete service hello-node
kubectl delete deployment hello-node
或者停止Minikube:
minikube stop