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从入门到放弃的更多相关文章

  1. 物联网架构成长之路(16)-SpringCloud从入门到吹水

    1.前言 Spring Cloud 现在比较流行,版本更新也是蛮快的,网上资料也是很多.很多参考网上资料就可以学到了.这里给个 http://blog.csdn.net/forezp/article/ ...

  2. 物联网架构成长之路(36)-Vue前端入门

    1. 前言 物联网平台,需要有一个类似大屏看板的功能. 找了一圈,发现阿里已经有对应的DataV产品,但是那个价格有点贵啊.所以找了这个[http://datav.jiaminghi.com/demo ...

  3. 物联网架构成长之路(42)-直播流媒体入门(RTMP篇)

    1. 安装RTMP流媒体服务器 以前其实我是利用Nginx-RTMP-module搭建过RTMP流媒体服务器,并实现了鉴权功能.参考https://www.cnblogs.com/wunaozai/p ...

  4. 物联网架构成长之路(41)-直播流媒体入门(RTSP篇)

    1. 搭建RTSP服务 首先现在音视频利器 ffmpeg,这个到http://www.ffmpeg.org/download.html 这里下载压缩包即可. 文档参考:http://trac.ffmp ...

  5. 物联网架构成长之路(40)-Bladex开发框架入门

    0. 前言 前一小节,讲了如何入门,这里就简单讲一下如何自定义查询和权限控制配置. 1. 配置多租户 如果要启用该表的多租户功能,需要在application.yml 这里配置. 2. 配置模糊匹配 ...

  6. 物联网架构成长之路(25)-Docker构建项目用到的镜像1

    0. 前言 现在项目处于初级阶段,按照规划,先构建几个以后可能会用到的Image,并上传到阿里云的Docker仓库.以后博客中用到的Image,大部分都会用到这几个基础的Image,构建一个简单的物联 ...

  7. 物联网架构成长之路(31)-EMQ基于HTTP权限验证

    看过之前的文章就知道,我之前是通过搞插件,或者通过里面的MongoDB来进行EMQ的鉴权登录和权限验证.但是前段时间发现,还是通过HTTP WebHook 方式来调用鉴权接口比较适合实际使用.还是实现 ...

  8. 物联网架构成长之路(46)-Rancher部署应用入门

    0.前言 上一篇已经安装好Rancher了,这一篇主要是简单的操作一下Rancher,了解一些常用功能.1.集群信息 选择对应的集群,查看对应集群信息. 还可以执行kubectl命令,命令可以参考前几 ...

  9. 物联网架构成长之路(24)-Docker练习之Compose容器编排

    0.前言 一开始学的之后,是想一步到位直接上Kubernetes(K8s)的,后面没想到,好像有点复杂,有些概念不是很懂.因此学习东西还是要循序渐进,慢慢来.先了解单机编排技术Docker Compo ...

随机推荐

  1. 对systemV和systemd的简单理解(服务方面)

    在CentOS7(RHEL7)以后,服务从原来的由systemV管理机制升级到了systemd. 在sysV中,所有的服务脚本都放在/etc/rc.d/init.d/中,可以使用/etc/rc.d/i ...

  2. window10下pytorch和torchvision CPU版本安装

    1.环境 python3.5 Anaconda 4.2.0 2.pytorch安装 pip3 install https://download.pytorch.org/whl/cpu/torch-1. ...

  3. 学习UML类图

    在类图中一共包含以下几种模型元素,分别是:类(class).接口(interface)以及类之间的关系. 1.类(class) 在面向对象编程中,类是对现象世界中一组具有相同特征的物体的抽象. 2.接 ...

  4. SpringBoot 2.X从0到1实现邮件发送功能

    Spring中提供了JavaMailSender接口实现邮件发送功能,在SpringBoot2.X中也封装了发送邮件相关的Starter并且提供了自动化配置. 本文目录 一.添加对应的Starter二 ...

  5. Wpf Prism.Unity 7

    Prism.Unity 中UnityBootStrapper已经不用了,可以继承PrismApplication 1.Install-package Prism.Unity -v 7.2.0.1367 ...

  6. 7个Python小坑,给新手党的福利

    Python语言简单易用,但容易给新入门的朋友造成一些微妙的,难以捕捉的错误,稍不注意就入坑了. 因此,今天给大家总结一些易犯的小错误,让你轻松进行不踩坑的Python学习. 1.缩进,符号和空格不正 ...

  7. Define the Data Model and Set the Initial Data 定义数据模型并设置初始数据

    This topic describes how to define the business model and the business logic for WinForms and ASP.NE ...

  8. 再来五道剑指offer题目

    再来五道剑指offer题目 6.旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4, ...

  9. Linux—运行yum报错:No module named yum

    产生原因:yum基于python写的,根据报错信息提示,是yum的python版本对应不上目前python环境的版本导致的.也就是说 有人升级或者卸载了python. 解决方式: # 查看yum版本 ...

  10. 渗透测试学习 十五、 文件上传&&解析漏洞

    大纲:文件解析漏洞 上传本地验证绕过 上传服务器验证绕过 文件解析漏洞 解析漏洞主要说的是一些特殊文件被IIS.Apache.Nginx在某些情况下解释成脚本文件格式的漏洞. IIS 5.x/6.0解 ...