转载备份
影子 DOM(Shadow DOM)
你的 docker stop,它优雅吗? - 无糖拿铁,谢谢
清理Docker的container,image与volume · 零壹軒·笔记
Create a PyPI Mirror Site with devpi-server – SRE
优雅的终止 docker 容器 | iTimothy
Odoo 14 开发者指南第二十一章 性能优化 | Alan Hou 的个人博客
Odoo 14 开发者指南第八章 高级服务端开发技巧 | Alan Hou 的个人博客
kafka 系列:设置日志数据保存过期时间(含某个 topic)、日志策略_NIO4444-CSDN 博客_kafka 配置数据过期时间
Chromium 历史版本离线安装包 - 下载方法
怎样将 props 传递给 {this.props.children} | WebFuse
HappyBaseDoc
用户指南 — HappyBase 1.2.0 文档
安装指南 — HappyBase 1.2.0 文档
API 参考 — HappyBase 1.2.0 文档
PostgreSQL 时间转换
JS 中创建给定长度的数组
GSAP 入门 - 学习中心 - 绿袜
操作系统复习 | Happy Coding
如何理解 ip 路由和操作 linux 的路由表 - CodeAntenna
Elasticsearch 7.11 tokenizer, analyzer and filter 以及 IK 分词配置同义词、远程拓展词库 – Brave new world
podman 容器内访问 host 主机的端口 - 知识库 - BSMI KB 基础标准矿产工业
吐血总结!100 道经典 Python 面试题集锦上(附答案)
中共党史简表(1919 年 - 1949 年)
Dockerfile 详解_万 wu 皆可爱的博客 - CSDN 博客_dockerfile
为你的 Python 应用选择一个最好的 Docker 映像 | 亚马逊 AWS 官方博客
Ubuntu Server 支持中文
docker push | Docker Documentation
docker 创建本地仓库详解 (push/pull)_乱红飞的博客 - CSDN 博客_docker push 本地仓库
基于 Ubuntu 20.04 安装 Kubernetes 1.18
PostgreSQL 集群篇——PostgreSQL 的配置文件解析_51CTO 博客_postGresql
【PostgreSQL】——主从流复制_Teingi 的博客 - CSDN 博客_postgresql 主从复制
PostgreSQL: Documentation: 14: 27.4. Hot Standby
postgresql 主从复制、主从切换_偷懒的小陈的博客 - CSDN 博客_postgresql 主从
Postgres 用户、角色与权限 :: 68hub — 技术博客
中国共产党第二十次全国代表大会在京开幕 一图速览二十大报告
配置 docker 通过代理服务器拉取镜像
IPVS no destination available - Kubernetes 实践指南
Python 风格规范 — Google 开源项目风格指南
互动测试!党的二十大报告 100 题
自定义 ESlint 规则
Java 读取 OpenSSL 生成的秘钥, 进行 RSA 加解密 | 数字魔法
CSS(一)chrome 浏览器表单自动填充默认样式 - autofil_半个 GIS 半个前端的博客 - CSDN 博客
Nginx 多级代理下的真实 IP 透传 - CodeAntenna
Jenkins 环境变量
人民币金额大写规范 - 内蒙古农业大学财务处
[转]nginx 开启 websocket - 浅忆博客
ceph 创建使用 rbd
《三》配置 ceph 存储池 pool - Buxl's blog
基于 K8S 搭建 Ceph 分部署存储 – 唐玥璨 | 博客
序言 · Kubernetes 中文指南——云原生应用架构实战手册
服务器配置 - Redis 安装配置 | 灰帽子 - 任令仓的技术博客
Ubuntu 配置 sudo 命令不需要输入密码_ubuntu sudo 免密_一路向前 - 执着的博客 - CSDN 博客
修改 Docker 数据目录位置,包含镜像位置 - 腾讯云开发者社区 - 腾讯云
微服务架构实践(API Gateway)
微服务网关:从对比到选型,由理论到实践 | Java 程序员进阶之路
聊聊微服务网关
微服务网关:从对比到选型,由理论到实践
odoo 实现表分区 partition
使用 keepalived 搭建高可用服务 - 简书
业务网关的落地实践_文化 & 方法_Qunar 技术沙龙_InfoQ 精选文章
部署 Kubernetes PostgreSQL 实例 | domac 的菜园子
一套包含完整前后端的系统如何在 K8S 中部署?_k8s 前端_木讷大叔爱运维的博客 - CSDN 博客
前端安全系列(二):如何防止 CSRF 攻击? - 美团技术团队
traefik 自定义中间件 | coolcao 的小站
CSRF 原理和实战利用 - FreeBuf 网络安全行业门户
安全运维 - 如何在 Kubernetes 中使用注释对 ingress-nginx 及后端应用进行安全加固配置实践_唯一极客知识分享的技术博客_51CTO 博客
Kubernetes 进阶使用之 Helm,Kustomize
各种加密算法比较
Docker 的三种网络代理配置 · 零壹軒 · 笔记
本文档使用 MrDoc 发布
-
+
首页
基于 Ubuntu 20.04 安装 Kubernetes 1.18
> 本文由 [简悦 SimpRead](http://ksria.com/simpread/) 转码, 原文地址 [zhuanlan.zhihu.com](https://zhuanlan.zhihu.com/p/138554103) **前置步骤** -------- **1,确保禁止掉 swap 分区** K8s 的要求,在每个宿主机上执行: ``` gemfield@ai05:~$ sudo swapoff -a #修改/etc/fstab,注释掉swap那行,持久化生效 gemfield@ai05:~$ sudo vi /etc/fstab ``` **2,确保时区和时间正确** 每个宿主机上都要确保时区和时间是正确的。 如果时区不正确,请使用下面的命令来修改: ``` gemfield@ai05:~$ sudo timedatectl set-timezone Asia/Shanghai #修改后,如果想使得系统日志的时间戳也立即生效,则: gemfield@ai05:~$ sudo systemctl restart rsyslog ``` **3,确保每个机器不会自动 suspend(待机 / 休眠)** 因为是做服务器用途的嘛,之前在 Ubuntu 18.04 上是没遇到过这个问题的,但是不知怎么回事,在 Ubuntu 20.04 上遇到了这个自动 suspend 的问题: ``` May 7 11:44:32 ai05 NetworkManager[838]: <info> [1588823072.3956] manager: sleep: sleep requested (sleeping: no enabled: yes) May 7 11:44:32 ai05 gnome-shell[1603]: Screen lock is locked down, not locking May 7 11:44:32 ai05 NetworkManager[838]: <info> [1588823072.3974] manager: NetworkManager state is now ASLEEP May 7 11:44:32 ai05 systemd[1]: Reached target Sleep. May 7 11:44:32 ai05 systemd[1]: Starting Suspend... May 7 11:44:32 ai05 systemd-sleep[27086]: Suspending system... May 7 11:44:32 ai05 kernel: [ 2426.233326] PM: suspend entry (deep) May 7 11:44:32 ai05 kernel: [ 2426.252253] Filesystems sync: 0.018 seconds ``` 解决这个问题没有标准答案,可以在 BIOS 里设置?在 kernel 启动参数设置?在 Gnome 图形界面上设置?在网卡相关的命令上设置?Gemfield 使用的下面的命令,姑且是起作用了: ``` sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target ``` **4,设置 iptables 可以看到 bridged traffic** 先确认 Linux 内核加载了 br_netfilter 模块: ``` lsmod | grep br_netfilter ``` **确保 sysctl 配置中 net.bridge.bridge-nf-call-iptables 的值设置为了 1。** 在 Ubuntu 20.04 Server 上,这个值就是 1。如果你的系统上不一致,使用下面的命令来修改: ``` cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sudo sysctl --system ``` **5,设置 rp_filter 的值** 每个宿主机上执行。 因为 Gemfield 的 K8s 集群即将部署的是 calico 网络插件,而 calico 需要这个内核参数是 0 或者 1,但是 Ubuntu20.04 上默认是 2,这样就会导致 calico 插件报下面的错误(这是个 fatal 级别的 error): ``` int_dataplane.go 1035: Kernel's RPF check is set to 'loose'. \ This would allow endpoints to spoof their IP address. \ Calico requires net.ipv4.conf.all.rp_filter to be set to 0 or 1. \ If you require loose RPF and you are not concerned about spoofing, \ this check can be disabled by setting the IgnoreLooseRPF configuration parameter to 'true'. ``` 使用下面的命令来修改这个参数的值: ``` #修改/etc/sysctl.d/10-network-security.conf gemfield@ai05:~$ sudo vim /etc/sysctl.d/10-network-security.conf #将下面两个参数的值从2修改为1 #net.ipv4.conf.default.rp_filter=1 #net.ipv4.conf.all.rp_filter=1 #然后使之生效 gemfield@ai05:~$ sudo sysctl --system ``` **开始安装基础软件** ------------ **1,安装 Docker** 目前 Ubuntu 20.04 上没有 docker 官方提供的安装包,但是 Ubuntu 有,使用下面的命令来安装 Docker 吧: ``` gemfield@ai05:~$ sudo apt update gemfield@ai05:~$ sudo apt install docker.io gemfield@ai05:~$ sudo systemctl start docker gemfield@ai05:~$ sudo systemctl enable docker ``` 要在以前,我是不推荐这么做的,因为 Ubuntu 提供的 docker 包特别旧;现在不一样了,Ubuntu 提供的这个包也很新(目前是 docker 19.03)。 **开始安装 K8s master** ------------------- 以下的操作只在 master 宿主机上执行,适合中国大陆地区使用(因为弃用谷歌的源和 repo,转而使用阿里云的镜像): **1,安装 kubeadm kubeadm kubectl** ``` gemfield@master:~$ sudo apt-get update && sudo apt-get install -y ca-certificates curl software-properties-common apt-transport-https curl gemfield@master:~$ curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add - gemfield@master:~$ sudo tee /etc/apt/sources.list.d/kubernetes.list <<EOF deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main EOF gemfield@master:~$ sudo apt-get update gemfield@master:~$ sudo apt-get install -y kubelet kubeadm kubectl gemfield@master:~$ sudo apt-mark hold kubelet kubeadm kubectl ``` **1.1 拉取镜像** ``` kubeadm config images list docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.25.0 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.25.0 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.25.0 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.25.0 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.8 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.4-0 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.9.3 ``` ``` docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.25.0 registry.k8s.io/kube-apiserver:v1.25.0 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.25.0 registry.k8s.io/kube-controller-manager:v1.25.0 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.25.0 registry.k8s.io/kube-scheduler:v1.25.0 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.25.0 registry.k8s.io/kube-proxy:v1.25.0 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.8 registry.k8s.io/pause:3.8 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.4-0 registry.k8s.io/etcd:3.5.4-0 docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.9.3 registry.k8s.io/coredns/coredns:v1.9.3 ``` **2,初始化 master** 注意,这里使用了阿里云的镜像,然后使用了非默认的 CIDR(一定要和宿主机的局域网的 CIDR 不一样!勿谓言之不预也!) ``` gemfield@master:~$ sudo kubeadm init --pod-network-cidr 172.16.0.0/16 \ --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers ``` 上面的命令执行成功后,会输出一条和 kubeadm join 相关的命令,后面加入 worker node 的时候要使用。另外,给自己的非 sudo 的常规身份拷贝一个 token,这样就可以执行 kubectl 命令了: ``` gemfield@master:~$ mkdir -p $HOME/.kube gemfield@master:~$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config gemfield@master:~$ sudo chown $(id -u):$(id -g) $HOME/.kube/config ``` **3,安装 calico 插件** 下载 calico 的 k8s yaml 文件,修改里面的 CALICO_IPV4POOL_CIDR 的值来避免和宿主机所在的局域网段冲突(gemfield 就是把原始的 192.168.0.0/16 修改成了 172.16.0.0/16): ``` #下载 https://docs.projectcalico.org/v3.11/manifests/calico.yaml #修改CALICO_IPV4POOL_CIDR,然后 gemfield@master:~$ kubectl apply -f calico.yaml ``` 等待着所有的 pod 都 ready 吧,有问题评论留言; **安装 K8s worker 节点** -------------------- 在每个 worker 宿主机上,执行上面初始化 master 最后输出的命令,在 Gemfield 的集群上,看起来是这样: ``` gemfield@ai05:~$ kubeadm join 192.168.0.95:6443 --token jejfa8.ucmaee76674pz6iv \ --discovery-token-ca-cert-hash sha256:05a3870ed36fece1df131f7597b2c04f331c2f97034fe15f7ca2a2999253a776 ``` 安装 K8s dashboard ---------------- 使用下面的命令: [https://github.com/kubernetes/dashboard](https://link.zhihu.com/?target=https%3A//github.com/kubernetes/dashboard) ``` gemfield@master:~$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml ``` 但是这样的方式启动的 dashboard 访问会不太方便,Gemfield(以前 CivilNet 项目就这么干的)更改了 yaml 中的 service 暴露端口的方式: ``` kind: Service apiVersion: v1 metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kubernetes-dashboard spec: ports: - port: 17030 targetPort: 8443 type: NodePort externalIPs: - 192.168.0.95 selector: k8s-app: kubernetes-dashboard ``` 这样就可以直接在浏览器里访问了。 然后使用的 yaml 创建 admin-user: ``` apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kubernetes-dashboard ``` 再使用下面的 yaml 绑定一个 role,这里是 cluster-admin 的 role,集群管理者: ``` 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 ``` 然后获取登录所需的 token,使用下面的命令获取: ``` gemfield@master:~$ kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}') ``` 然后访问网址,输入 token 登录。 **安装 Ingress** -------------- K8s 的 ingress controller 有很多种实现:[https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/](https://link.zhihu.com/?target=https%3A//kubernetes.io/docs/concepts/services-networking/ingress-controllers/) 。但是 K8s 官方支持和维护的是 GCE 和 NGINX 两种 controller。这里 Gemfield 安装的是 NGINX ingress controller,可以参考 [Bare-metal considerations](https://link.zhihu.com/?target=https%3A//kubernetes.github.io/ingress-nginx/deploy/baremetal/) 到 Gemfield 本文的时候,Nginx ingress 的版本已经到了 0.32,使用下面的命令来进行安装: ``` gemfield@master:~$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-0.32.0/deploy/static/provider/baremetal/deploy.yaml ``` 注意:这个 yaml 文件默认使用了 NodePort 的方式来暴露服务,而 Nginx ingress contoller 一共支持以下的方式: * MetalLB * NodePort * host network * self-provisioned edge * External IPs Gemfield 使用了 NodePort + External IP 的方式,需要修改该 yaml 文件中 name 为 ingress-nginx-controller 的 service(可见由 CivilNet 添加了 externalIPs 字段): ``` apiVersion: v1 kind: Service metadata: labels: helm.sh/chart: ingress-nginx-2.0.3 app.kubernetes.io/name: ingress-nginx app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/version: 0.32.0 app.kubernetes.io/managed-by: Helm app.kubernetes.io/component: controller name: ingress-nginx-controller namespace: ingress-nginx spec: type: NodePort ports: - name: http port: 80 protocol: TCP targetPort: http - name: https port: 443 protocol: TCP targetPort: https externalIPs: - 192.168.0.95 - 192.168.0.34 selector: app.kubernetes.io/name: ingress-nginx app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/component: controller ``` **如何移除一个节点** ------------ 使用下面的命令: ``` gemfield@ai05:~$ kubectl drain ai05 --delete-local-data --force --ignore-daemonsets gemfield@ai05:~$ kubectl delete node ai05 ``` 然后在被移除的节点上(比如,ai05)执行: ``` gemfield@ai05:~$ kubeadm reset ``` 但是这样只是清理了 K8s 相关的目录和配置,已有的 iptables rules 或者 IPVS tables 或者路由表信息并没有被清理,你需要使用相关的命令来清理。 如果要移除 master,也就是整个 k8s,则在 master 上: ``` gemfield@master:~$ kubeadm reset ```
幻翼
2022年9月13日 15:52
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码