K8S V1.23 安装--Kubeadm+contained+公网 IP 多节点部署

本文档详细介绍了如何在两台公网服务器上,通过Kubeadm和containd安装Kubernetes集群。涉及内容包括系统设置、containd和crictl的安装、错误处理、K8S安装、主节点和工作节点的集群加入、Dashboard安装访问。在公网环境下,需注意IP配置、端口开放以及网络插件选择。

简介

基于两台公网的服务器节点,两个服务器不再局域网内,只能通过公网 IP 相互访问,搭建 K8S 集群,并且按照 Dashboard,通过网页查看 K8S 相关的东西

环境及机器说明

两台机器,其中一台作为主节点,一台作为工作节点

操作系统都是centos7,centos8配置虚拟网卡有点麻烦

  • crio-master(主节点):121.4.190.84
  • vm-20-11-centos(工作节点):106.55.227.160

系统设置准备

同时在两台机器上执行

根据官方的文档,配置下一些系统属性

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sysctl --system

# 修改Hosts文件,添加相关的配置,示例如下:
[root@crio-master k8s]# cat /etc/hosts
121.4.190.84 crio-master
106.55.227.160 VM-20-11-centos

由于我们使用的是公网 ip,但是在云服务器中是没有对应的网卡的,这导致在 kubeadm 部署时使用公网 IP 有问题

所以我们在两台机器中新建对应各自公网 ip 的虚拟网卡(下面方式建立的重启后,会被删除,但目前也够用了)

# 安装软件包
modprobe tun
lsmod | grep tun

# 编辑文件
vim /etc/yum.repos.d/nux-misc.repo
# 填入下面的内容
[nux-misc]
name=Nux Misc
baseurl=http://li.nux.ro/download/nux/misc/el7/x86_64/
enabled=0
gpgcheck=1
gpgkey=http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro

# 安装
yum --enablerepo=nux-misc install tunctl

# 新建虚拟网卡
tunctl -t publick -u root
# 配置网卡的IP,注意替换ip成自己机器对应的公网IP
ifconfig publick 121.37.246.218 netmask 255.255.255.0 promisc

注:K8S 部署需要开通 6443 端口,在服务器的安全规则配置中,将 6443 端口开启

containd 安装

两个机器上都安装

docker 作为我们日常经常使用的,但感觉比较重了,我们尝试不使用 docker,使用推荐的,较底层的 contained(cri-o 也行,目前尝试下来,没有想象中那么难用)

# 将机器人上的docker清理下,不然会有影响
yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
yum remove docker-ce

# 我们单独安装contained即可
yum install -y yum-utils
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
yum install containerd.io

# 加载
systemctl daemon-reload

# 启动服务
systemctl enable containerd
systemctl start containerd
systemctl status containerd

crictl 安装

两个机器上都安装

容器运行时的命令行操作工具,和 docker 命令很像,可以类比 docker,如下命令:

  • docker ps == crictl ps
  • docker logs == crictl logs
# 下载安装,下载不了,到github上找个版本:https://github.com/kubernetes-sigs/cri-tools/releases?q=v1.23.1&expanded=true,把下面的version改改就行了
VERSION="v1.24.1"
wget https://github.com/kubernetes-sigs/cri-tools/releases/download/$VERSION/crictl-$VERSION-linux-amd64.tar.gz
sudo tar zxvf crictl-$VERSION-linux-amd64.tar.gz -C /usr/local/bin
rm -f crictl-$VERSION-linux-amd64.tar.gz

# 编辑配置文件
vim /etc/crictl.yaml
# 填入下面的内容
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 2
debug: false
pull-image-on-create: false

这样就 OK 了,可以运行命令尝试下:

crictl ps
crictl images

错误处理记录

FATA[0000] listing containers: rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.RuntimeService
➜  ~ crictl ps
FATA[0000] listing containers: rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.RuntimeService

删除下配置文件

rm /etc/containerd/config.toml
$ systemctl restart containerd

k8s 安装

两个机器都需要执行

# 增加软件源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
 http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

# 设置下
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

# 清理以前的版本,如果有的话
yum remove kubelet kubeadm kubectl
yum install -y kubelet-1.23.1 kubeadm-1.23.1 kubectl-1.23.1

# 启动
systemctl enable --now kubelet

# 编辑下配置文件
mkdir -p /etc/systemd/system/kubelet.service.d/
vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
# 填入下面的内容
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
# 这是 "kubeadm init" 和 "kubeadm join" 运行时生成的文件,动态地填充 KUBELET_KUBEADM_ARGS 变量
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
# 这是一个文件,用户在不得已下可以将其用作替代 kubelet args。
# 用户最好使用 .NodeRegistration.KubeletExtraArgs 对象在配置文件中替代。
# KUBELET_EXTRA_ARGS 应该从此文件中获取。
EnvironmentFile=-/etc/default/kubelet
ExecStart=
<think>我们当前要解决的问题是:在使用`os.system`执行`pytest`命令生成HTML报告时出现乱码错误。 根据用户提供的信息,我们知道问题出现在生成HTML报告时的编码错误。用户使用了类似这样的命令:`pytest -v -s --html=report.html`,然后出现了乱码。 可能的原因和解决方案: 1. **编码问题**:可能是生成的HTML报告使用了非UTF-8编码,而打开时使用了不同的编码导致乱码。 - 解决方案:可以尝试在生成报告时指定编码。但是,`pytest-html`插件本身可能没有直接提供设置编码的参数。我们可以通过修改测试环境或使用其他方式。 2. **环境变量**:系统环境变量可能影响了编码。特别是在Windows系统上,默认编码可能是GBK等,而报告内容包含非GBK字符(如中文)时就会乱码。 - 解决方案:在运行测试前设置环境变量`PYTHONUTF8=1`,或者设置`PYTHONIOENCODING=utf-8`,强制使用UTF-8编码。 3. **修改pytest命令**:我们可以尝试在生成报告时,通过重定向标准输出和错误到文件并指定编码,但`os.system`可能不支持直接重定向。或者,我们可以使用Python的`subprocess`模块代替`os.system`,这样能更好地控制编码。 4. **使用pytest的配置选项**:在`pytest.ini`文件中配置默认编码,但是`pytest-html`插件可能不会读取这个配置。 5. **修改生成的HTML文件**:在生成报告后,用正确的编码重新保存文件。但这不是很优雅。 建议的解决方案步骤: 由于用户使用的是`os.system`,我们可以尝试在命令前设置环境变量(针对Windows和Linux/macOS有不同的方式)。 例如,在Windows命令提示符中,我们可以这样: ``` set PYTHONIOENCODING=utf-8 && pytest -v -s --html=report.html ``` 但是,在`os.system`中,我们可以这样写: ```python import os # 对于Windows os.system("set PYTHONIOENCODING=utf-8 && pytest -v -s --html=report.html") ``` 然而,这种方法可能不够健壮,因为环境变量的设置可能不会持续到后续命令(取决于系统)。另外,在Linux/macOS中,应该使用`export`。 更好的方法是使用`subprocess`模块,它可以让我们在子进程中设置环境变量。 使用`subprocess`的示例: ```python import subprocess import sys # 创建一个新的环境变量副本,并设置我们需要的编码 env = os.environ.copy() env['PYTHONIOENCODING'] = 'utf-8' # 或者尝试设置PYTHONUTF8(Python 3.7以上) env['PYTHONUTF8'] = '1' # 运行pytest命令 result = subprocess.run( [sys.executable, '-m', 'pytest', '-v', '-s', '--html=report.html'], env=env, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, # 使用文本模式,这样stdout和stderr会是字符串(使用默认编码,但我们设置了环境变量,所以应该是utf-8) encoding='utf-8' # 指定编码为utf-8,这样返回的字符串就是utf-8编码 ) ``` 但是,注意:`pytest-html`插件生成报告时,其编码可能由插件内部决定。查看`pytest-html`的文档,我们发现它有一个`--css`选项,但没有直接设置编码的选项。生成的HTML文件默认是使用UTF-8编码吗? 实际上,`pytest-html`生成的HTML文件在`<head>`中会指定: ```html <meta charset="utf-8"> ``` 所以,理论上浏览器应该以UTF-8打开。如果还是乱码,可能是文件保存时不是UTF-8编码,或者文件内容在写入时已经乱码(因为控制台输出时编码错误)。 因此,我们更倾向于认为问题出在运行pytest时,控制台输出的编码问题。因为`pytest-html`报告会收集控制台输出,如果控制台输出有乱码,那么报告也会乱码。 所以,设置环境变量`PYTHONIOENCODING`为`utf-8`,或者设置`PYTHONUTF8=1`(Python 3.7以上)可以解决控制台输出的编码问题。 另外,如果用户使用的是Windows系统,且控制台(如cmd)默认编码是GBK,那么我们可以尝试在运行测试前修改控制台编码,但这可能影响整个系统。所以,在代码中设置环境变量是更好的方法。 因此,我们推荐使用`subprocess`模块,并在子进程中设置环境变量。 如果用户坚持使用`os.system`,那么可以尝试: ```python # 对于Windows os.system("chcp 65001 && set PYTHONIOENCODING=utf-8 && pytest -v -s --html=report.html") ``` 这里,`chcp 65001`将控制台代码页设置为UTF-8(在Windows上)。但是,请注意,这种方式可能会遇到其他问题(比如字体不支持)。 对于Linux/macOS,通常终端默认支持UTF-8,所以只需设置环境变量: ```python os.system("export PYTHONIOENCODING=utf-8; pytest -v -s --html=report.html") ``` 但是,跨平台怎么办呢?我们可以根据系统选择不同的命令。 然而,更简洁的方式是使用`subprocess`,因为它可以跨平台设置环境变量。 所以,总结解决方案: 1. 使用`subprocess`模块,在运行pytest命令前设置环境变量`PYTHONIOENCODING`为`utf-8`,并设置`PYTHONUTF8=1`(如果Python版本>=3.7)。 2. 确保生成的HTML报告在浏览器中打开时使用UTF-8编码(报告本身已经指定了UTF-8,所以只要内容正确,浏览器就会正确显示)。 示例代码: ```python import subprocess import os import sys # 复制当前环境并设置编码相关的环境变量 env = os.environ.copy() env['PYTHONIOENCODING'] = 'utf-8' # 对于Python3.7及以上,可以设置 env['PYTHONUTF8'] = '1' # 构建命令 command = [sys.executable, '-m', 'pytest', '-v', '-s', '--html=report.html'] # 运行命令 result = subprocess.run(command, env=env) # 检查结果 if result.returncode != 0: print("运行测试失败!") else: print("测试成功完成!") ``` 注意:如果用户使用的Python版本低于3.7,则`PYTHONUTF8`可能不被支持,但`PYTHONIOENCODING`应该有效。 另外,如果用户需要捕获输出,可以使用`stdout`和`stderr`参数,如上面的例子(但这里我们不需要捕获,因为`-s`参数让输出到控制台)。 如果用户希望保留控制台输出(实时打印),则不要使用`stdout=subprocess.PIPE`,而是直接让子进程使用父进程的标准输出: ```python result = subprocess.run(command, env=env) ``` 这样,测试过程中的输出就会实时显示在控制台。 如果问题仍然存在,请检查: - 是否安装了最新版本的`pytest-html`?可以尝试升级插件。 - 是否在测试用例中打印了非UTF-8编码的字符?确保测试用例输出的内容也是UTF-8编码。 另外,如果用户使用的是Windows,并且控制台本身不支持UTF-8(比如旧版cmd),那么即使设置了环境变量,控制台显示也可能乱码,但报告文件可能正确(因为环境变量影响了写入文件的内容)。所以,我们主要关注报告文件是否乱码。 因此,我们建议用户采用上述`subprocess`方法,并设置环境变量。 如果用户的环境无法升级到Python3.7以上,那么只设置`PYTHONIOENCODING`为`utf-8`。 最后,如果用户遇到其他问题,可以尝试在生成报告后,用代码打开HTML文件并重新保存为UTF-8编码(使用`codecs`模块或指定编码打开),但通常不需要。 因此,我们给出以下代码解决方案: ```python import subprocess import os import sys # 设置环境变量 env = os.environ.copy() env['PYTHONIOENCODING'] = 'utf-8' # 如果Python版本>=3.7,可以设置PYTHONUTF8 if sys.version_info >= (3, 7): env['PYTHONUTF8'] = '1' # 运行pytest命令 cmd = [sys.executable, '-m', 'pytest', '-v', '-s', '--html=report.html'] try: subprocess.run(cmd, env=env, check=True) except subprocess.CalledProcessError as e: print(f"运行测试失败,退出码:{e.returncode}") ``` 这样应该能解决编码问题。 如果用户需要,还可以添加其他参数,比如指定测试路径等。 注意:如果用户使用的不是`pytest-html`,而是其他生成报告的插件,可能需要查看该插件的文档以确定编码设置。 但是,根据用户的问题描述,我们假设使用的是`pytest-html`插件。 因此,我们推荐上述解决方案。 如果用户的问题仍未解决,可能需要提供更多错误信息,例如具体的乱码表现,是在控制台乱码还是在生成的HTML文件中乱码?但根据问题描述,是生成HTML报告时的乱码,所以我们认为是报告文件内容乱码。 另外,如果用户的环境中有特殊字符(如中文字符)出现在测试用例的输出中,那么设置编码环境变量就尤为重要。 最后,我们提供完整代码示例,并假设用户已经安装了`pytest`和`pytest-html`。 如果用户还没有安装`pytest-html`,可以使用以下命令安装: ``` pip install pytest-html ``` 现在,我们按照要求生成相关问题:</think>### 解决 pytest HTML 报告编码错误的方法 在使用 `os.system` 执行 pytest 命令生成 HTML 报告时出现乱码错误,通常是由于系统编码与报告生成编码不一致导致的。以下是完整的解决方案: #### 解决方法 1. **设置环境变量(推荐)** 在运行 pytest 前设置 `PYTHONIOENCODING` 环境变量为 UTF-8: ```python import os # 设置编码环境变量 os.environ["PYTHONIOENCODING"] = "utf-8" # 执行 pytest 命令 os.system("pytest -v -s --html=report.html") ``` 2. **修改 pytest 命令(直接指定编码)** 在 pytest 命令中添加 `--encoding=utf-8` 参数: ```python os.system("pytest -v -s --html=report.html --encoding=utf-8") ``` 3. **修改 HTML 报告模板(持久解决方案)** 编辑 `pytest-html` 的模板文件(通常在 `site-packages/pytest_html/templates` 目录): ```html <!-- 在 <head> 标签内添加 --> <meta charset="UTF-8"> ``` 4. **使用 subprocess 替代 os.system** 更可靠地控制编码: ```python import subprocess cmd = ["pytest", "-v", "-s", "--html=report.html"] subprocess.run(cmd, env={"PYTHONIOENCODING": "utf-8"}) ``` #### 完整示例代码 ```python import os import sys # 设置系统编码 if sys.platform.startswith("win"): os.system("chcp 65001 > nul") # Windows 切换到 UTF-8 代码页 # 设置环境变量 os.environ["PYTHONIOENCODING"] = "utf-8" # 执行 pytest 命令 os.system("pytest -v -s --html=report.html --encoding=utf-8") ``` #### 验证步骤 1. 检查生成的 HTML 文件头是否包含:`<meta charset="UTF-8">` 2. 在 Python 脚本开头添加编码声明: ```python # -*- coding: utf-8 -*- ``` 3. 确保测试代码中的字符串使用 Unicode 格式: ```python # 正确 print(u"中文内容") # 错误 print("中文内容".encode("gbk")) ``` > **根本原因**:Windows 系统默认使用 GBK 编码,而 pytest-html 生成的报告默认使用 UTF-8 编码,导致中文等非 ASCII 字符显示乱码[^1][^2]。跨平台开发时应显式指定编码。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值