Kubernetes Operator

https://www.redhat.com/zh/topics/containers/what-is-a-kubernetes-operator

Kubernetes Operator 是一种封装、部署和管理 Kubernetes 应用的方法。我们使用 Kubernetes API(应用编程接口)和 kubectl 工具在 Kubernetes 上部署并管理 Kubernetes 应用。

Kubernetes Operator 是一种特定于应用的控制器,可扩展 Kubernetes API 的功能,来代表 Kubernetes 用户创建、配置和管理复杂应用的实例


2022-05-17 Operator

Contour 设计理念

Contour 是一个第 7 层 HTTP 中间件反向代理,用于启用 Kubernetes 集群的入口。

没有目标

  • Contour 不是服务网格
  • Contour 也无意公开 Envoy 的所有功能或配置选项
  • Contour 不适用于代理第 4 层协议,例如 TCP 或 UDP,除非它们需要传递 HTTP。

因此,TCP 代理是可用的,但希望代理用于通过 HTTPS。将来可能会添加一些 UDP 支持,以便我们可以支持使用 UDP 作为传输的 QUIC。使用 Contour 代理原始 TCP 或 UDP 流量可能有效,但不是预期用途

最终用户

集群管理员

集群管理员负责 Kubernetes 集群的运行状况和运行。他们负责与外部世界的连接、TLS 秘密管理和 DNS 等。他们负责安装 Contour 和 Envoy、这些应用程序的软件生命周期以及 Contour 应用程序配置

应用程序开发人员

应用程序开发人员是希望在 Kubernetes 集群上部署 Web 应用程序或微服务工作负载的人,并且对集群的访问权限少于管理员。它们通过创建 Contour 可以理解的类型的 Kubernetes 对象与 Contour 进行交互,并且除了对这些对象的影响之外,它们与 Contour 本身没有交互。

意见/评价

Contour 是一个有着专一的项目。我们认为 Contour 的很大一部分价值在于它专精的方法。我们相信这种方式可以让我们编写更好的软件来满足维护者和用户的需求

合理的默认值

互联网中的许多项目提供了广泛的配置范围。总的来说,这是一件好事。大多数项目都是由几乎没有机构来运营的。因此必须可以在运行时进行配置。然而,这种做法已经演变为 如果某些东西可以配置,那么它应该是可配置的。

Contour 的设计理念,尽可能使用 Envoy 的配置参数,不会过多的增加配置,而是根据实际需要的用户做出取舍。

Contour 的立场是,当 Envoy 配置参数有合理的默认值时,Contour 将无条件地应用它。过去,我们通过无条件压缩 HTTP 响应主体、禁止 TLS/1.0、选择激进的密码套件等来使用此位置。 如果我们无法找到普遍接受的值,Contour 将为管理员或开发人员提供一种方法来提供他们选择的值作为最后的手段。在该项目的历史上,第二种情况很少发生。通常,由更改特定参数的愿望引发的讨论导致对 Contour 的使用方式有更深入的了解,否则不会发生这种情况。

明确的功能范围定义

Kubernetes 集群上 HTTP 工作负载的反向代理实现。Contour 对 TCP 代理的有限支持仅用于 Contour 支持希望直接处理 TLS 的 Web 应用程序。

应用程序开发人员或集群管理员可以支持每个功能

对于我们添加的每个功能,我们都必须有一个问题的答案——最终用户能否在无需升级到 Contour 维护人员的情况下调试此功能中的故障? 如果涉及第三方组件,我们如何将应用程序开发人员连接到失败的组件,以使他们在无需我们调解的情况下彼此作为第一方知道对方? 这意味着我们更愿意避免添加客户无法自行调试的功能——即使是他们的系统出了问题。 在添加验证功能时,我们会在设计空间方面犯错,即使它不是最完整的,也要尽快给客户反馈;即,由 api 服务器强制执行的 CRD 验证优于对象上的状态字段。 在设计 Kubernetes 对象时,我们尝试将信息尽可能靠近需要它的对象公开。例如,我们将确保 HTTPProxy 对象具有状态条件,告诉创建它们的用户是否存在问题,而不仅仅是从 Contour 本身记录该信息。

我们在用户所在的地方与他们会面

Contour 目前支持 Ingress、HTTPproxy 和 Kubernetes Gateway API。我们不要求用户选择他们想要使用的入口 API,相反,我们会考虑为任何请求的类型提供支持,以满足任何地方的用户。 这个目标与最小表面积的目标相冲突,但我们意识到将我们所有的用户引导到仅在 Contour 中实现的 API 不利于他们的互操作性,并限制了我们的总目标市场。这个目标的想法是,我们会在新的入口类型可用时深思熟虑地考虑它们,如果我们认为这是一个好主意,就将它们添加进去。


2022-05-11 Contour

MacOS 隐藏 Dock 栏中特定应用

背景说明

MacOS Dock 栏的空间是有限的,而且绝大部分应用都会占用一个 Dock 的槽位;但并不是所有软件都提供了 Hidden in Dock 的能力,所以从来不点击,但一直存在,挺痛苦的。

为不具备隐藏 Dock Icon 的应用附加隐藏能力

符合这类特征的软件:a. 常驻应用,开机自启动,基本不会打开;b. 像我这样的 Alfred 爱好者

之前了解到一些软件对系统的影响都比较大,基本上都是要接管 整个Dock,要关闭 SIP,使用成本太好,基本不值得采用。

Github 全球同性交友网站

下午在闲逛的时候,发现了这个仓库: https://github.com/FirePanther/MacOS-Hide-Dock-Icon ,一个非常简单的 PHP 脚本,貌似可以提供这个能力,于是我就简单的 Download,按照 README.md 的方法执行了一下。

很神奇的!满足了我的需求!所以,我在这里记录和分享给大家,如果你也需要的话。

操作步骤

当然,你也可以直接 从这切换到 官方仓库的 README.md 去操作

# 下载 脚本文件
➜  ~ wget https://raw.githubusercontent.com/FirePanther/MacOS-Hide-Dock-Icon/master/hideDockIcon.php -O hideDockIcon.php

# 备份地址
➜  ~ wget https://raw.githubusercontent.com/SAMZONG/MacOS-Hide-Dock-Icon/master/hideDockIcon.php -O hideDockIcon.php

确保你的 Mac 内装有 PHP

brew install php   # just one command

接下就是操作步骤了:在此之前,你需要完全退出被隐藏的软件**

image-20220507152104232

下方是脚本的执行过程:

➜  ~ sudo php hideDockIcon.php
App name: BaiduNetdisk_mac
Cracking app BaiduNetdisk_mac
Info.plist successfully injected
Signing ------
/Applications/BaiduNetdisk_mac.app: replacing existing signature
------

Finished  # 看到这个就是成功了

执行成功后,再次打开 App,App 会先在 Dock 栏跳动加载,加载完后图标自动消失,但 App 依旧在运行。

以上,你就成功的隐藏这个需要的软件,经过在测试,脚本的健壮性很好:

支持的 PC : 2022 年 M1 Max MacOS12.3.1

注意事项

确认对的 App Name

image-20220507153226027

恢复被隐藏的应用

首先 > 还是要退出 App,这时 Dock 栏也不显示了,菜单栏也没有,所以不好使用 邮件退出的方式,那么接下来我们要找到下方这个软件:

image-20220507153525040

打开软件后,等待加载完成,通过搜索窗口利用 App name 找到被隐藏的软件

image-20220507154000558

然后使用上方的,X 关闭按钮,在弹窗中,选择 Quit

然后 > 再去执行下 hideDockIcon.php 这个脚本:

sudo php hideDockIcon.php
Password:
App name: BaiduNetDisk_mac
Cracking app BaiduNetDisk_mac
This app should be invisible in the Dock
Would you like to show it? (y/n) y
Info.plist successfully injected
Signing ------
/Applications/BaiduNetDisk_mac.app: replacing existing signature
------

Finished

然后再次启动 App,那么就会出现在 Dock 栏并且不再隐藏

结语

没事儿还是要逛逛 Github


2022-05-07 Mac

满足预期的文档站 Mkdocs

组合三件套

  • Mkdocs # 热门的静态博客框架
  • Mkdocs-material # Mkdocs 颜值担当的主题
  • MkDocs Awesome Pages Plugin # Mkdocs 动态的 Navgation 插件

依赖的插件

pip install mkdocs 
pip install mkdocs-material 
pip install mkdocs-git-revision-date-plugin 
pip install mkdocs-mermaid2-plugin 
pip install mkdocs-rss-plugin 
pip install mkdocs-minify-plugin 
pip install mkdocs-macros-plugin 
pip install mkdocs-git-revision-date-localized-plugin 
pip install mkdocs-awesome-pages-plugin 

Github repo

Private Teamplate https://github.com/SAMZONG/mkdocs-template

Awesome Plugin 常用参数

在文档内的路径展示

docs
├── .pages.yaml     # 站点顶部导航配置文件,控制顺序和名称,一般不增加
├── README.md       # 默认情况下 目录下 README.md 作为 default 页面
├── SUMMARY.md
├── dce5.0          # 子文件夹,支持多级目录,自动检测配置
│   ├── .pages.yaml
│   ├── 01kpanda.md # 子文件自动检测,可以通过文件名前缀数字控制排序
│   ├── 02ghippo.md
│   ├── 03clusterpedia.md
│   ├── ...
├── design
│   ├── .pages.yaml # 每个目录下都有一个 `.pages.yaml` 用来进行目录的配置
│   ├── README.md
│   ├── ...
~~~

通过对每个文件下的特定处理,默认情况下 `.pages.yaml` 为空即可,如需要特殊处理,可以在文档添加下方参数:

```yaml
title: Products     # 文件夹展示的标题
order: 1            # 文件夹的顺序,数字越小越靠前
hide: false         # 是否隐藏,默认不隐藏
nav:                # 采用自定义导航
    - filename.md
    - filename2.md
    - ...

nav 的配置方式,还有更多高级用法,可以参考插件做的的 Github 介绍 传送门

mkdocs.yaml 的配置变更

  1. 不要设定 nav OR page
  2. plugin 增加下方配置
plugins:
  - awesome-pages:
       filename: .pages.yaml
       collapse_single_pages: true
       strict: false

2022-05-06 Tools

阿里云云原生网关

网关实例创建

image.png image.png

网关实例列表

image.png

网关实例详情

image.png

路由管理

image.png image.png image.png

安全能力

黑名单、白名单 image.png 认证鉴权 image.png

亮点功能

新手引导

image.png

image.png image.png image.png

监控看板细致

image.png

image.png

录屏存放处

仅 DaoCloud 可查看


2022-05-06 云原生网关 , 阿里云

腾讯云微服务网关

网关管理

默认这里展示对应的网关列表,未提供网关的创建入口,需要依赖前序的网关应用创建;

image.png

:::warning 在 微服务的应用中心 进行网关创建 ::: image.png

网关的创建过程

text

网关绑定的分组管理

一个网关下可以创建多个分组,分别指向不同的 托管 API,根据访问的 Context 区分 image.png

分组下的 API 管理

  • API 类型为:微服务 API,支持检测自动导入 API;也支持手工编辑
  • API 类型为:外部 API,仅支持支持手工编辑

插件管理

  • 主要支持 2 类型 插件:
    • Auth
    • 转义 Tag <特色>

image.png

网关监控

监控部分均是自研,实现的内容也比较简单

基于网关的监控

image.png

基于 API 的统计监控

image.png

录屏存放处

仅 DaoCloud 可查看

https://yongyu2000hotmailcom.sharepoint.cn/:f:/s/ndx/Emsrgwa4Z7xMsT4P8GMd31IB5p1zTy__gNKWn10_ynvvIQ?e=GFNejD


2022-05-06 云原生网关 , 腾讯云

Alfred Workflow 推荐

Alfred 介绍

Alfred 是 Mac 上一款著名的效率应用,强大的功能和众多的扩展能让你在实际操作中大幅提升工作效率,网络上也有大量关于的 Alfred 的评测和技巧的文章。

image

Workflow 介绍

Workflow 工作流;将一件事情的多个步骤,通过一个的规则相连,并依次执行,最终完成,这个方式就是工作流;Alfred Workflow 就是一个将我们日常工作流 实现的一个工具,可以让我们在 Alfred 中更加方便的完成我们的工作;现实生活中的工作流可能更为复杂,但本质还是如此。正是基于这种现实背景,alfred 从 2.0 版本起加入了 workflow,简单的示例说明。

mUZ6OI

我的推荐

整理常用的一些 Workflow 分享,提高工作和生活的效率小技巧。

5 星推荐


4 星推荐

如何获取 Workflow ?

可以到这个网站 https://www.packal.org/ 有非常丰富的 Workflow 或者 主题可以选择,丰富你的 Alfred 使用

如果你有能力制作一些优秀的 Workflow,也可以在这里分享

更多关于 Alfred 的使用教程

网络上已经有大量的 视频和文本的使用教程了,所以我这里直接引用我学习时使用的教程

视频教程

文本教程

程序员的 macOS 系列:高效 Alfred 进阶

同时,也推荐下这位优秀博主,如果关注 iOS 开发,可以关注他更新的内容


2022-05-03 Mac

youtube-dl 下载 YouTube 视频

截止 2022.5 youtube-dl 已经较长时间未更新了,建议采用 yt-dlp, 将命令进行替换即可

安装新版本的 yt-dlp

brew install yt-dlp/taps/yt-dlp

yt-dlp 是从 youtube-dl 分支出来的版本,提供持续更新和向前兼容,在友好型上做了优化;仅需要将所有安装命令中 youtube-dl 替换为 yt-dlp

如果你还是喜欢使用 youtube-dl,可以使用以下命令将程序默认替换,同时不影响你的使用:

➜  ~ alias youtube-dl=yt-dlp
➜  ~ echo "alias youtube-dl=yt-dlp"  >> ~/.zshrc  # or ~/.bashrc


youtube-dl 下载 YouTube 视频

视频下载命令行工具里,网友推荐通常都是『国外视频用 youtube-dl』,有这两个工具国内外主流视频网站的视频基本就横扫了,适合想收藏或者喜欢下载后用本地播放器的 Geek 群体。

命令行工具本身其实不复杂,理解了它们的语法就能开始使用了,结合 Alfred 还可以把常用的命令设置成触发的动作,提升交互体验和效率。然而很多人一看网站的介绍估计和我最初的感受差不多,还要部署一堆使用环境啊。

Xcode 的命令行工具

Homebrew 环境安装前先检查一下 Xcode 的命令行工具是否已经安装,如果 macOS 系统更新过可能也需要重新安装一次,「终端」(应用程序 - 实用工具 - 终端)中输入 xcode-select --install

➜  ~ xcode-select --install
xcode-select: error: command line tools are already installed, use "Software Update" to install updates
➜  ~

先前配置时已经安装过 Xcode 命令行工具,所以会出现上面的提示信息。

Homebrew 依赖

Homebrew 是一个 macOS 上的软件包管理工具,通过命令行的方式安装和卸载软件,大部分的流行软件都提供了 Homebrew 的安装方式,也是开源世界里安装和更新软件的主流方式;

Homebrew

只需要在联网的情况下运行一行命令:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

更多关于 Homebrew 的使用相关,可以查看我的另一篇文章 Mac 下 Homebrew 的使用

安装 youtube-dl

上面刚学习到的命令可以先用起来,先看看 youtube-dl 的软件信息,在终端里输入 brew info youtube-dl,了解一下 youtube-dl 的依存环境和需要搭档的其他应用。

从终端运行的反馈能看到,youtube-dl 的使用环境是 Python3,合并视频片断还会用到 ffmpeg 这个组件,也就是说安装完 youtube-dl,还要再运行一次 brew install ffmpeg

brew install youtube-dl
brew install ffmpeg

youtube-dl 的基本用法

前 3 步结束已经可以用命令行下载视频了,这里介绍几个常用的命令,更多的命令用法在官网都有介绍,查看 Github 更全的操作指引 Document

➜  ~ youtube-dl -h | grep Options
Options:
  General Options:
  Network Options:
  Download Options:
  Filesystem Options:
  Thumbnail Options:
  Verbosity / Simulation Options:
  Video Format Options:
  Subtitle Options:
  Authentication Options:
  Adobe Pass Options:
  Post-processing Options:

导出视频指定文件名称

youtube-dl https://www.youtube.com/watch?v=Ga4UCK627nU -o "~/Downloads/aaa.mp4"

youtube-dl 还提供了 一些变量的方式,可以作用在文件名上,比较常用的如下:

# %(title)s.%(ext)s 则是指定了文件名的格式,%(title)s 是视频的标题,%(ext)s 则是视频的文件扩展名
youtube-dl https://www.youtube.com/watch?v=Ga4UCK627nU -o "~/Downloads/%(title)s.%(ext)s"

通过 视频名.扩展名 这样可以规范化导出文档的名称;还有其他非常丰富的变量支持,可以去这里找到你想要的 Output Template

查询视频支持的版本

导出的画质不如意,希望自定义导出画质,可以采用这个方式,使用 -F 查看视频资源支持的类型,通过 -f 指定对应的版本进行下载

➜  ~ youtube-dl -F https://www.youtube.com/watch\?v\=BYkHLlKFEsM
[youtube] BYkHLlKFEsM: Downloading webpage
[info] Available formats for BYkHLlKFEsM:
format code  extension  resolution note
249          webm       audio only tiny   53k , webm_dash container, opus @ 53k (48000Hz), 2.44MiB
250          webm       audio only tiny   70k , webm_dash container, opus @ 70k (48000Hz), 3.22MiB
140          m4a        audio only tiny  129k , m4a_dash container, mp4a.40.2@129k (44100Hz), 5.93MiB
251          webm       audio only tiny  136k , webm_dash container, opus @136k (48000Hz), 6.27MiB
160          mp4        256x144    144p   32k , mp4_dash container, avc1.4d400c@  32k, 30fps, video only, 1.48MiB
278          webm       256x144    144p   75k , webm_dash container, vp9@  75k, 30fps, video only, 3.45MiB
133          mp4        426x240    240p   48k , mp4_dash container, avc1.4d4015@  48k, 30fps, video only, 2.21MiB
242          webm       426x240    240p   76k , webm_dash container, vp9@  76k, 30fps, video only, 3.51MiB
134          mp4        638x360    360p   80k , mp4_dash container, avc1.4d401e@  80k, 30fps, video only, 3.70MiB
243          webm       638x360    360p  115k , webm_dash container, vp9@ 115k, 30fps, video only, 5.28MiB
135          mp4        852x480    480p  120k , mp4_dash container, avc1.4d401f@ 120k, 30fps, video only, 5.50MiB
244          webm       852x480    480p  161k , webm_dash container, vp9@ 161k, 30fps, video only, 7.41MiB
136          mp4        1278x720   720p  217k , mp4_dash container, avc1.4d401f@ 217k, 30fps, video only, 9.97MiB
247          webm       1278x720   720p  273k , webm_dash container, vp9@ 273k, 30fps, video only, 12.52MiB
248          webm       1916x1080  1080p  896k , webm_dash container, vp9@ 896k, 30fps, video only, 41.01MiB
137          mp4        1916x1080  1080p  923k , mp4_dash container, avc1.640028@ 923k, 30fps, video only, 42.24MiB
18           mp4        638x360    360p  350k , avc1.42001E, 30fps, mp4a.40.2 (44100Hz), 16.07MiB (best)

➜  ~ youtube-dl -f 137 https://www.youtube.com/watch\?v\=BYkHLlKFEsM  # 下载对应的 format code
➜  ~ youtube-dl -f best https://www.youtube.com/watch\?v\=BYkHLlKFEsM  # 下载最佳的版本

仅导出音频文件

:::information_source: 经常拿过来做个人的歌曲库导出,youtube-dl -x 提供了 -x 参数来进行指定 仅导出音频,--extract-audio 这里需要使用到 ffmpeg

youtube-dl -x https://www.youtube.com/watch?v=Ga4UCK627nU -o "~/Downloads/%(title)s.%(ext)s"

默认下载的音频文件类型,可能无法满足你,这个时候,可以使用 --audio-format 参数,来指定对应的音频格式(使用 ffmpeg 自动转码),目前支持个格式类型有:

Specify audio format: "best", "aac","flac", "mp3", "m4a", "opus", "vorbis",or "wav"; "best" by default
youtube-dl -x https://www.youtube.com/watch?v=Ga4UCK627nU -o "~/Downloads/%(title)s.%(ext)s" --audio-format mp3

2022-05-03 Mac

淘宝 Python SDK 优化支持 Python3

淘宝开放平台的 SDK,Python 的 SDK 是在 2012 年,仅支持 Python2.7 及以上,但不支持 Python3;二现在是 2102 年了,像我这样的新手都是直接从 Python3 开始的,

1. Python3 int 替代了 long

P_TIMESTAMP: str(int(time.time() * 1000))

2. 用 items 替代 iteritems

for key, value in application_parameter.items():

3. 查阅资料,发现有人说到 dict methods dict.keys(), dict.items() and dict.values() return“views”instead of lists.这样就显而易见知道怎么改了

keys = sorted(keys)

4. 英文意思很明确,unicode 对象在哈希之前必须进行编码转换,想起之前又看到过中文字符在 python 中是以 unicode 存在的,所以

sign = hashlib.md5(parameters.encode("utf-8")).hexdigest().upper()

5. 这是花费时间最长的一个错误。首先,直接看最后,错误在 soket.py 里,心凉了半截,难道这里的调用都不一样了,再网上看又是 python 3.X 的 http 模块,去百度了半天也没有发现类似的错误,只能自己硬着头皮去看模块,功夫不负有心人,其实也很简单,在类 HTTPConnection 的初始化函数是这样定义的

connection = httplib.HTTPConnection(self.__domain, self.__port, timeout)

比较下参数发现,python 2 比 3 多了一个参数,去掉即可,这个错误主要是是报错的地方和修改的地方不在一起,所以很难插出原因。

6. 官方文档是这样解释的:urllib has been split up in Python 3. The urllib.urlencode() function is now urllib.parse.urlencode(), and the urllib.urlopen() function is now urllib.request.urlopen()

url = N_REST + "?" + urllib.parse.urlencode(sys_parameters)

7. 这个错误是在 API 调用出异常的时候暴露出来的。原因前面已经提到了,稍微查了下替代的方法

if "error_response" in jsonobj:

if P_CODE in jsonobj["error_response"]:

8. 在 if 需要使用反向时,应该是 != ,而不是使用  is not;这个也是 PyCharm 给的建议,所以在使用时,所以简单调整下就好了

if response.status != 200:

以上调整之后,基本就可以正常跑起来了,基本是可以支持 Python3 的使用,我试过了 Python3.6-3.9,都是 OK 的。


2022-05-03 Python

kubernetes 学习之路

基础环境

  • MacOS M1
  • Paralles Desktop 17
  • Ubuntu 20.04.4

ubuntu 安装替换系统源

# 默认注释了源码仓库,如有需要可自行取消注释
deb https://mirrors.aliyun.com/ubuntu-ports/ xenial main restricted universe multiverse
# deb-src https://mirrors.aliyun.com/ubuntu-ports/ xenial main main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu-ports/ xenial-updates main restricted universe multiverse
# deb-src https://mirrors.aliyun.com/ubuntu-ports/ xenial-updates main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu-ports/ xenial-backports main restricted universe multiverse
# deb-src https://mirrors.aliyun.com/ubuntu-ports/ xenial-backports main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu-ports/ xenial-security main restricted universe multiverse
# deb-src https://mirrors.aliyun.com/ubuntu-ports/ xenial-security main restricted universe multiverse

ubuntu 基础系统优化

时区问题处理

# 调整为为北京时区
sudo cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# 增加时间自动同步
sudo crontab -e
*/15 * * * * /usr/sbin/ntpdate 1.cn.pool.ntp.org  >/dev/null 2>&1

Kubernetes 镜像源替换

apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - 
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl

docker 安装及源替换

# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common

# step 2: 安装GPG证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

# Step 3: 写入软件源信息
sudo add-apt-repository "deb http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

# Step 4: 更新并安装 Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce docker-ce-cli containerd.io

docker 的安装源配置

cat <<EOF > /etc/docker/daemon.json
{
  "registry-mirrors": [
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
  ],
  "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

systemctl daemon-reload
systemctl restart docker

docker cgroupdriver 在多个 node 和 master 之间不一致,会导致 node join 失败

Kubernetes 部署机器

  • 4 核 4G 3 台
    • 10.211.55.7 master1
    • 10.211.55.9 node1
    • 10.211.55.10 node2
# This is the network config written by 'subiquity'
network:
  ethernets:
    enp0s5:
      addresses: [10.211.55.10/24]
      dhcp4: no
      gateway4: 10.211.55.1
      nameservers:
      addresses: [114.114.114.114]
  version: 2

为了防止多台机器之间的 DHCP IP 冲突,全部限定静态 IP < 采用的是 Parallels Desktop Clone pvm 的方式 产生的多台机器

Kubernetes 从 k8s.gcr.io 仓库拉取镜像失败

这是因为 k8s 部署是在 google 自家的所以… ,好在国内基本都有对应的镜像仓库,这里以 阿里云为例:

root@master1:~# kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.23.5
k8s.gcr.io/kube-controller-manager:v1.23.5
k8s.gcr.io/kube-scheduler:v1.23.5
k8s.gcr.io/kube-proxy:v1.23.5
k8s.gcr.io/pause:3.6
k8s.gcr.io/etcd:3.5.1-0
k8s.gcr.io/coredns/coredns:v1.8.6

使用 docker pull 分布拉取这些 image,将 k8s.gcr.io 替换为 registry.aliyuncs.com/google_containers/

# 原为
docker pull k8s.gcr.io/kube-apiserver:v1.23.5
# 改为
docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.23.5

然后,依次将所有需要的 image 都拉取下来,使用 docker image list 查看拉取的镜像

root@master1:~# docker image ls
REPOSITORY                                                        TAG       IMAGE ID       CREATED        SIZE
registry.aliyuncs.com/google_containers/kube-apiserver            v1.23.5   dc83c48dbe3b   5 weeks ago    132MB
registry.aliyuncs.com/google_containers/kube-controller-manager   v1.23.5   de8edc9077c1   5 weeks ago    122MB
registry.aliyuncs.com/google_containers/kube-scheduler            v1.23.5   48609f8bab08   5 weeks ago    53MB
registry.aliyuncs.com/google_containers/kube-proxy                v1.23.5   48d3a9e595bc   5 weeks ago    109MB
registry.aliyuncs.com/google_containers/etcd                      3.5.1-0   1040f7790951   5 months ago   132MB
registry.aliyuncs.com/google_containers/coredns                   v1.8.6    edaa71f2aee8   6 months ago   46.8MB
registry.aliyuncs.com/google_containers/pause                     3.6       7d46a07936af   7 months ago   484kB

由于 kubeadm 认的是 k8s.gcr.io,所以还需改回去 Tag,修改方式采用 docker tag 的方式处理

kubeadm 初始化 k8s 环境

root@master1:~# kubeadm init --kubernetes-version=v1.23.5 --pod-network-cidr=10.244.0.0/16
[init] Using Kubernetes version: v1.23.5
[preflight] Running pre-flight checks
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Generating "ca" certificate and key
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local master1] and IPs [10.96.0.1 10.211.55.7]
[certs] Generating "apiserver-kubelet-client" certificate and key
[certs] Generating "front-proxy-ca" certificate and key
[certs] Generating "front-proxy-client" certificate and key
[certs] Generating "etcd/ca" certificate and key
[certs] Generating "etcd/server" certificate and key
[certs] etcd/server serving cert is signed for DNS names [localhost master1] and IPs [10.211.55.7 127.0.0.1 ::1]
[certs] Generating "etcd/peer" certificate and key
[certs] etcd/peer serving cert is signed for DNS names [localhost master1] and IPs [10.211.55.7 127.0.0.1 ::1]
[certs] Generating "etcd/healthcheck-client" certificate and key
[certs] Generating "apiserver-etcd-client" certificate and key
[certs] Generating "sa" key and public key
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "kubelet.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Starting the kubelet
[control-plane] Using manifest folder "/etc/kubernetes/manifests"
[control-plane] Creating static Pod manifest for "kube-apiserver"
[control-plane] Creating static Pod manifest for "kube-controller-manager"
[control-plane] Creating static Pod manifest for "kube-scheduler"
[etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"
[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
[apiclient] All control plane components are healthy after 4.511137 seconds
[upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[kubelet] Creating a ConfigMap "kubelet-config-1.23" in namespace kube-system with the configuration for the kubelets in the cluster
NOTE: The "kubelet-config-1.23" naming of the kubelet ConfigMap is deprecated. Once the UnversionedKubeletConfigMap feature gate graduates to Beta the default name will become just "kubelet-config". Kubeadm upgrade will handle this transition transparently.
[upload-certs] Skipping phase. Please see --upload-certs
[mark-control-plane] Marking the node master1 as control-plane by adding the labels: [node-role.kubernetes.io/master(deprecated) node-role.kubernetes.io/control-plane node.kubernetes.io/exclude-from-external-load-balancers]
[mark-control-plane] Marking the node master1 as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule]
[bootstrap-token] Using token: k2qw1l.lpnjzo138zfynmb1
[bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles
[bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to get nodes
[bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstrap-token] configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstrap-token] configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[kubelet-finalize] Updating "/etc/kubernetes/kubelet.conf" to point to a rotatable kubelet client certificate and key
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 10.211.55.7:6443 --token k2qw1l.lpnjzo138zfynmb1 \
 --discovery-token-ca-cert-hash sha256:974a7569ca2d243dc907ca121adbdba9407ae462ea72791342ccf2048ee46b31

k8s 系统优化

# 增加到文件最后,进行系统层级优化

net.ipv4.ip_forward = 1
vm.swappiness = 1
net.bridge.bridge-nf-call-arptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_local_reserved_ports = 30000-32767
vm.max_map_count = 262144
fs.inotify.max_user_instances = 524288
kernel.pid_max = 65535

Kubesphere registry 仓库:

registry.cn-beijing.aliyuncs.com/kubesphereio/


2022-04-24 基础知识