物联网架构成长之路(43)-k8s从入门到放弃
0. 前言
这段时间要入门一下CI/CD了,以前简单的了解过Jenkins,现在要把以下的这个图的架构搭建起来。国外可能一两个命令就安装完成的事情,我折腾了2天多,真的差点放弃了。
1. 安装VirtualBox
参考这篇官方文档 https://www.virtualbox.org/wiki/Linux_Downloads
在 /etc/apt/sources.list 增加以下内容
deb [arch=amd64] https://download.virtualbox.org/virtualbox/debian stretch contrib
下载签名
wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add -
apt-get update
apt-get install virtualbox-6.0
安装后,最好重启一下。
2. 安装操作系统
下载debian 镜像
wget https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-10.1.0-amd64-netinst.iso
创建一个镜像,然后配置一下iso镜像启动,然后安装操作系统。
接下来就是普通的Linux安装了
安装成功后,安装几个日常工具后,就可以复制多份镜像出来,然后就可以进行练习了。
修改VM虚拟机为桥接,那么就可以运行局域网内任何计算机通过IP进行访问。
修改/etc/ssh/sshd_confg 中的 PermitRootLogin yes 允许root用户登录。
3. 安装docker
Debian10 可以直接安装,不需要修改/etc/apt/source.list
apt-get install docker.io
创建 /etc/docker/daemon.json 文件,并添加如下内容:
{
"registry-mirrors": ["https://xd80iytl.mirror.aliyuncs.com"]
}
如果有其它镜像库,也可以添加到这里面,registry-mirrors的值是一个数组;
重启docker服务
service docker restart
4. 安装kubernetes
4.1 安装k8s
增加证书
wget -q https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg -O- | apt-key add -
往 /etc/apt/source.list 增加
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
apt-get update
apt-get install kubeadm kubectl kubectx kubelet kubernetes-cni
4.2 修改三台主机名称,并写到/etc/hosts
hostnamectl set-hostname master
hostnamectl set-hostname node1
hostnamectl set hostname node2
写到 /etc/hosts
172.16.23.200 master
172.16.23.142 node1
172.16.23.157 node2
4.3 修改内核参数
修改内核参数 /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables =
net.bridge.bridge-nf-call-iptables =
net.ipv4.ip_forward =
立即生效
sysctl --system
如果还报这个错
[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables does not exist
[ERROR FileContent--proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1
#那么执行
modprobe br_netfilter
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
4.4 关闭交互内存swap
swapoff -a
4.5 重置kubeadm
kubeadm reset
rm -rf ~/.kube/
service kubelet restart
systemctl status kubelet
4.6 下面这个在Master主机执行
kubeadm init --apiserver-advertise-address=172.16.23.200 --pod-network-cidr 10.244.0.0/ --image-repository registry.aliyuncs.com/google_containers --v=
注意172.16.23.200 这个是Master主机IP。而10.244.0.0/16先要这么写,后续安装CNI的flannel插件的时候,会依赖这个虚拟网络地址。然后由于众所周知原因,需要指定镜像仓库为aliyuncs。
如果init过程中出现,错误,需要重置的,可以执行
kubeadm reset
rm -rf ~/.kube/
成功后截图【放心,一般没有那么容易成功,这个安装太多坑了】
4.7 按要求执行这些命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
4.8 记录节点node加入集群的 kubeadm join 信息
kubeadm join 172.16.23.200: --token rm9y0a.u550ra92k4rh9wca \
--discovery-token-ca-cert-hash sha256:428c8c94afd1697cb8ca2d5c5571d194a0db4b91056219e7a9e9f31b9bf60037 #若忘记join token,可通过以下命令获取
kubeadm token create --print-join-command
4.9 安装CNI插件
执行 kubectl get nodes 发现status状态是 NotReady,通过service kubelet status 发现错误原因
root@master:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady master 2m56s v1.16.2
root@master:~# service kubelet status
● kubelet.service - kubelet: The Kubernetes Node Agent
Loaded: loaded (/lib/systemd/system/kubelet.service; enabled; vendor preset: enabled)
Drop-In: /etc/systemd/system/kubelet.service.d
└─-kubeadm.conf
Active: active (running) since Wed -- :: CST; 3min 33s ago
Docs: https://kubernetes.io/docs/home/
Main PID: (kubelet)
Tasks: (limit: )
Memory: 43.2M
CGroup: /system.slice/kubelet.service
└─ /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/config.yaml --cgroup-driver=cgroupfs Nov :: master kubelet[]: W1106 ::04.523652 cni.go:] Unable to update cni config: no networks found in /etc/cni/net.d
Nov :: master kubelet[]: E1106 ::04.852874 kubelet.go:] Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin i
Nov :: master kubelet[]: W1106 ::09.525813 cni.go:] Unable to update cni config: no networks found in /etc/cni/net.d
Nov :: master kubelet[]: E1106 ::09.863154 kubelet.go:] Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin i
Nov :: master kubelet[]: W1106 ::14.527639 cni.go:] Unable to update cni config: no networks found in /etc/cni/net.d
出现Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of “crypto/rsa: verification error” while trying to verify candidate authority certificate “kubernetes”) 修改配置
export KUBECONFIG=/etc/kubernetes/admin.conf
修改/etc/hosts 【我这里临时性访问不了这个网站,可以通过修改hosts,附件提供】
151.101.56.133 raw.githubusercontent.com
安装CNI
在安装完 Master 节点后,查看节点信息( kubectl get nodes)会发现节点的状态为noready。查看noready的原因发现是由于cni插件没有配置(容器网络接口)。其实这是由于还没有配置网络。可以配置多种网络,这里我们选用最长远的 fannel 网络进行配置。
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml
如果要重置可以执行 kubectl delete -f kube-flannel.yml
由于kube-flannel.yml 里面镜像是来自quay.io, 需要改为 quay-mirror.qiniu.com
还是会出现 Unable to update cni config: No networks found in /etc/cni/net.d
解决:修改文件内容: /etc/systemd/system/kubelet.service.d/10-kubeadm.conf 第5行增加这句
Environment="KUBELET_NETWORK_ARGS=--network-plugin=cni --cni-conf-dir=/etc/cni/ --cni-bin-dir=/opt/cni/bin"
4.10 执行重新启动命令
systemctl daemon-reload
systemctl restart kubelet.service
service docker restart
service kubelet restart
# 等系统启动和服务发现,预计1-2分钟
kubectl get nodes
4.11 以上过程,如果出现不成功,重启再执行一遍,慢慢排查原因。
哈哈
5. 节点Node 加入 Master
在两个节点node1 和 node2 执行
kubeadm join 172.16.23.200: --token rm9y0a.u550ra92k4rh9wca \
--discovery-token-ca-cert-hash sha256:428c8c94afd1697cb8ca2d5c5571d194a0db4b91056219e7a9e9f31b9bf60037
在Master机上,执行查看命令
6. 练习启动Pod
#启动两个Nginx
kubectl run nginx --image=nginx:1.10 --port= --replicas=
#通过 kubectl get pod --all-namespaces -o wide 发现一直处于ContainerCreating ,因为下载nginx 需要182M。等2-3分钟后,完成部署,处于Running状态
#排查问题
kubectl get pods
kubectl describe pod nginx
#删除
kubectl delete pod nginx-b864db7b7-lpc76
kubectl delete deployment nginx
通过YAML模版方式部署集群
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx1
spec:
replicas:
selector:
matchLabels:
name: nginx1
template:
metadata:
labels:
name: nginx1
spec:
containers:
- name: nginx1
image: nginx:1.13
imagePullPolicy: IfNotPresent
ports:
- containerPort:
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service-nodeport
spec:
ports:
- port:
targetPort:
protocol: TCP
type: NodePort
selector:
name: nginx1
执行
kubectl apply -f nginx.yaml
还有很多高级命令,如创建、查看、滚动更新、回滚、扩容、缩容,各种集成玩法。
7. 从入门到放弃
k8s真丶从入门到放弃。这个环境配置了两天,我最后可能选择放弃,投入到Rancher的怀抱。
参考资料:
https://blog.csdn.net/qq_21816375/article/details/80222689
https://www.cnblogs.com/omgasw/p/10548334.html
https://blog.csdn.net/ywq935/article/details/80109090
https://my.oschina.net/jianming/blog/2354157
https://blog.csdn.net/oMaoYanEr/article/details/102762654
https://www.cnblogs.com/wjoyxt/p/9988158.html
https://www.jianshu.com/p/63f7f5c021e4
附件下载:https://files.cnblogs.com/files/wunaozai/kube-flannel.zip
本文地址:https://www.cnblogs.com/wunaozai/p/11805259.html
本系列目录: https://www.cnblogs.com/wunaozai/p/8067577.html
个人主页:https://www.wunaozai.com/
物联网架构成长之路(43)-k8s从入门到放弃的更多相关文章
- 物联网架构成长之路(16)-SpringCloud从入门到吹水
1.前言 Spring Cloud 现在比较流行,版本更新也是蛮快的,网上资料也是很多.很多参考网上资料就可以学到了.这里给个 http://blog.csdn.net/forezp/article/ ...
- 物联网架构成长之路(36)-Vue前端入门
1. 前言 物联网平台,需要有一个类似大屏看板的功能. 找了一圈,发现阿里已经有对应的DataV产品,但是那个价格有点贵啊.所以找了这个[http://datav.jiaminghi.com/demo ...
- 物联网架构成长之路(42)-直播流媒体入门(RTMP篇)
1. 安装RTMP流媒体服务器 以前其实我是利用Nginx-RTMP-module搭建过RTMP流媒体服务器,并实现了鉴权功能.参考https://www.cnblogs.com/wunaozai/p ...
- 物联网架构成长之路(41)-直播流媒体入门(RTSP篇)
1. 搭建RTSP服务 首先现在音视频利器 ffmpeg,这个到http://www.ffmpeg.org/download.html 这里下载压缩包即可. 文档参考:http://trac.ffmp ...
- 物联网架构成长之路(40)-Bladex开发框架入门
0. 前言 前一小节,讲了如何入门,这里就简单讲一下如何自定义查询和权限控制配置. 1. 配置多租户 如果要启用该表的多租户功能,需要在application.yml 这里配置. 2. 配置模糊匹配 ...
- 物联网架构成长之路(25)-Docker构建项目用到的镜像1
0. 前言 现在项目处于初级阶段,按照规划,先构建几个以后可能会用到的Image,并上传到阿里云的Docker仓库.以后博客中用到的Image,大部分都会用到这几个基础的Image,构建一个简单的物联 ...
- 物联网架构成长之路(31)-EMQ基于HTTP权限验证
看过之前的文章就知道,我之前是通过搞插件,或者通过里面的MongoDB来进行EMQ的鉴权登录和权限验证.但是前段时间发现,还是通过HTTP WebHook 方式来调用鉴权接口比较适合实际使用.还是实现 ...
- 物联网架构成长之路(46)-Rancher部署应用入门
0.前言 上一篇已经安装好Rancher了,这一篇主要是简单的操作一下Rancher,了解一些常用功能.1.集群信息 选择对应的集群,查看对应集群信息. 还可以执行kubectl命令,命令可以参考前几 ...
- 物联网架构成长之路(24)-Docker练习之Compose容器编排
0.前言 一开始学的之后,是想一步到位直接上Kubernetes(K8s)的,后面没想到,好像有点复杂,有些概念不是很懂.因此学习东西还是要循序渐进,慢慢来.先了解单机编排技术Docker Compo ...
随机推荐
- Zookeeper分布式锁实战
场景描述: 在线程高并发场景下,生成唯一的订单编号,如: 2017-10-14-20-52-33-01 年-月-日-时-分-秒-序号 (1)Lock锁接口 package com.zookeeper. ...
- H5生成二维码
要用H5生成二维码: 1.引入js库,可自行点击链接复制使用 <script type="text/javascript" src="http://static.r ...
- IT兄弟连 HTML5教程 HTML5和JavaScript的关系
JavaScript可是实现HTML5重要语言.长久以来,JavaScript一直都是在HTML中实现动态效果的不二之选,而JavaScript在一些程序员眼里都是编程语言中的二等公民.早先,它经常是 ...
- Vue-router中的history模式和hash模式
还记得在我们从零开始搭建一个Vue-cli3.0项目时,预设置中出现过这样一条询问: 即是否选择历史模式,当时我们很坚决地选了否,那么哈希模式和历史模式究竟有什么区别,今天我们来一探究竟. 哈希模式( ...
- 常见的Web源码泄露总结
常见的Web源码泄露总结 源码泄露方式分类 .hg源码泄露 漏洞成因: hg init 的时候会生成 .hg 漏洞利用: 工具: dvcs-ripper .git源码泄露 漏洞成因: 在运行git i ...
- MES系统在小批量电子行业生产管理中的应用
小批量电子产品生产管理的主要问题 电子电器制造类企业,既有单件小批量生产,也有批量生产:有按库存生产,也有按订单生产,属于典型的离散制造行业.因产品的不同其生产工艺流程也不尽相同,生产设备的布置不是按 ...
- 【JavaScript】使用document.write输出覆盖HTML问题
您只能在 HTML 输出中使用 document.write.如果您在文档加载后使用该方法,会覆盖整个文档. 分析 HTML输出流是指当前数据形式是HTML格式的数据,这部分数据正在被导出.传输或显示 ...
- [转]关于maven pom.xml中dependency type 为pom的应用
原文地址:http://blog.csdn.net/yao123long/article/details/49925659 dependency为什么会有type为pom,默认的值是什么?depend ...
- Python—序列化和反序列化模块(json、pickle和shelve)
什么是序列化 我们把对象(或者变量)从内存中变为可存储或者可传输的过程称为序列化.在python中为pickling,在其他语言中也被称之为serialization,marshalling,flat ...
- STL顺序容器的基本操作
容器主要分为:顺序容器和关联容器 顺序容器和关联容器,顺序容器主要有:vector.list.deque等.其中vector表示一段连续的内存地址,基于数组的实现,list表示非连续的内存,基于链表实 ...