May 072021
 

以前朋友开玩笑,说我就是只会写OpenStack的安装。后来搞PaaS的时候,我就基本没动手安装过K8s,这次读张磊的大作,为了加深理解,也自己动手装一遍k8s。

现在手工装一遍k8s,如果不考虑HA,那么其实就真的用不了多久。步骤,也越来越简单。下面操作,基本都是参考kubeboard 文档

环境

3个虚拟机就可以搞定,也不需要太大的规格,其实就够用。都是2core,4G内存,40G存储,CentOS 7.6的虚拟机。

  • kubeadm-master
  • kubeadm-work1
  • kubeadm-nfs

K8S相关的软件和相关版本

  • Kubernetes v1.21.x
  • calico 3.17.1
  • nginx-ingress 1.9.1
  • Containerd.io 1.4.3

配置

下面的配置,都是需要在master节点和work节点进行相同的操作。

hostname

# 修改 hostname
hostnamectl set-hostname kubeadm-master
# 查看修改结果
hostnamectl status
# 设置 hostname 解析
echo "127.0.0.1   $(hostname)" >> /etc/hosts

NFS client

# 安装 nfs-utils
yum install -y nfs-utils wget

Containerd

# 阿里云 docker hub 镜像
export REGISTRY_MIRROR=https://registry.cn-hangzhou.aliyuncs.com

# 安装 containerd

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

modprobe overlay
modprobe br_netfilter

#Setup required sysctl params, these persist across reboots.
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

# Apply sysctl params without reboot
sysctl --system

# 设置 yum repository
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 安装 containerd
yum install -y containerd.io-1.4.3

mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml

sed -i "s#k8s.gcr.io#registry.aliyuncs.com/k8sxio#g"  /etc/containerd/config.toml
sed -i '/containerd.runtimes.runc.options/a\ \ \ \ \ \ \ \ \ \ \ \ SystemdCgroup = true' /etc/containerd/config.toml
sed -i "s#https://registry-1.docker.io#${REGISTRY_MIRROR}#g"  /etc/containerd/config.toml

systemctl daemon-reload
systemctl enable containerd
systemctl restart containerd

kubeadm

# 配置K8S的yum源
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

# 安装kubelet、kubeadm、kubectl,kubeadm 依赖把kubelet kubectl 都装上。避免key验证失败

yum install -y kubeadm-1.21.0 --nogpgcheck

crictl config runtime-endpoint /run/containerd/containerd.sock

# 重启 contained,并启动 kubelet
systemctl daemon-reload
systemctl enable kubelet && systemctl start kubelet

containerd --version
kubelet --version

Master节点初始化

下面的操作,就只需要在master节点进行就可以

# 只在 master 节点执行
# 替换 x.x.x.x 为 master 节点的内网IP
export MASTER_IP=10.0.38.147
# 替换 apiserver.demo 为 您想要的 dnsName
export APISERVER_NAME=apiserver.abc.com
# Kubernetes 容器组所在的网段,该网段安装完成后,由 kubernetes 创建,事先并不存在于您的物理网络中
export POD_SUBNET=10.100.0.1/16
echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hosts

配置文件,必须先设置好环境变量

cat <<EOF > ./kubeadm-config.yaml
---
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.21.0
imageRepository: registry.aliyuncs.com/k8sxio
controlPlaneEndpoint: "${APISERVER_NAME}:6443"
networking:
  serviceSubnet: "10.96.0.0/16"
  podSubnet: "${POD_SUBNET}"
  dnsDomain: "cluster.local"
dns:
  type: CoreDNS
  imageRepository: swr.cn-east-2.myhuaweicloud.com
  imageTag: 1.8.0

---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
EOF

拉取镜像和初始化

# 
kubeadm config images pull --config=kubeadm-config.yaml

##初始化 Master 节点
kubeadm init --config=kubeadm-config.yaml --upload-certs

配置

# 配置 kubectl
mkdir /root/.kube/
cp -i /etc/kubernetes/admin.conf /root/.kube/config

网络

# 安装 calico 网络插件

kubectl create -f https://kuboard.cn/install-script/v1.21.x/calico-operator.yaml
wget https://kuboard.cn/install-script/v1.21.x/calico-custom-resources.yaml
sed -i "s#192.168.0.0/16#${POD_SUBNET}#" calico-custom-resources.yaml
kubectl create -f calico-custom-resources.yaml

获取work节点添加所需要的token

kubeadm token create --print-join-command

work节点

对于work节点来说,要做的东西就很少,让work节点,知道api server的地址就可以。剩下就是运行join的命令,通过token,加入就可以。

# 只在 worker 节点执行
# 替换 x.x.x.x 为 master 节点的内网 IP
export MASTER_IP=x.x.x.x
# 替换 apiserver.demo 为初始化 master 节点时所使用的 APISERVER_NAME
export APISERVER_NAME=apiserver.kubeadm.abc.com
echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hosts

把work节点添加到集群

把上面在master输入命令获取token命令的输出,copy到所有work节点运行一遍就可以。这个token,有效期是2个小时。

NFS Server

wget https://get.helm.sh/helm-v3.5.4-linux-amd64.tar.gz
tar zxvf helm-v3.5.4-linux-amd64.tar.gz 
cd linux-amd64/
mv linux-amd64/helm /usr/local/bin/helm

helm version --short
helm repo add stable https://charts.helm.sh/stable
helm repo add supertetelman https://supertetelman.github.io/charts/
helm repo update
helm repo list

helm install nfs-client-provisioner --set nfs.server=10.0.38.193 --set nfs.path=/data/nfs supertetelman/nfs-client-provisioner

kubectl get storageclass

kubectl patch storageclass nfs-client -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

备注

contained操作

参考文章

  • https://kuboard.cn/install/v3/install.html
May 062021
 

以前看书的时候,没有动手的习惯,也经常导致理解的有问题,这次为了深入学习kubernetes,把书上原理的东西,都动手验证一遍。

我是在CentOS 7.6,安装了Docker的最新版本来验证这本书里的内容。

 mount -t cgroup
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio,net_cls)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)

cpu限制的目录

# ls /sys/fs/cgroup/cpu
cgroup.clone_children  container             cpu.cfs_period_us  cpu.shares         release_agent
cgroup.event_control   cpuacct.stat          cpu.cfs_quota_us   cpu.stat           system.slice
cgroup.procs           cpuacct.usage         cpu.rt_period_us   docker             tasks
cgroup.sane_behavior   cpuacct.usage_percpu  cpu.rt_runtime_us  notify_on_release  user.slice

下面就是操作的例子

cd /sys/fs/cgroup/cpu
mkdir container
ls container/

刚刚创建完的目录下,就已经一堆文件。运行一行代码,这是一个死循环,cpu占有 100%,看看如何通过cgoup来限制这种cpu占有。

# while : ; do : ; done &
[1] 25737

第一行代码是一个死循环,输出25737,是进程id号。通过top,你可以看到这个进程的cpu占用情况

可以很清楚看到 25737进程,已经95%。

查看当前的设置

# cat /sys/fs/cgroup/cpu/container/cpu.cfs_quota_us 
-1
[root@devops ~]# cat /sys/fs/cgroup/cpu/container/cpu.cfs_period_us
100000

修改参数,就可以实现对cpu的控制

echo 2000 > /sys/fs/cgroup/cpu/container/cpu.cfs_quota_us 

把限制的进程id,写入tasks里,这里就是:25737

echo 25737 > /sys/fs/cgroup/cpu/container/tasks 

这时候,你再使用top命令查看cpu占用情况。

看看cpu的限制的效果。

人生第一次做CPU限制,顺利完成。

收尾工程,杀死进程

kill 9 25737

这样你用top就无法看到这个进程。

May 062021
 

默认CentOS yum的Docker版本很低,应该一直都没升级。这次我是真CentOS 7.6 虚拟机里,完成这个测试。

如果以前有安装老版本,需要卸载

yum remove docker  docker-common docker-selinux docker-engine

安装工具

yum install yum-utils device-mapper-persistent-data lvm2

添加阿里的docker repo

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

查看一下结果

yum list docker-ce --showduplicates | sort -r

选择一个docker版本来安装

yum install docker-ce-20.10.6

启动相关服务

systemctl start docker
systemctl enable docker

Apr 212021
 

靠ping是不太靠谱,telnet端口,经常需要装。今天在mac下。

nc -vz -w 2 www.baidu.com 80
Connection to www.baidu.com port 80 [tcp/http] succeeded!

挺方便,就几个参数

  • -v 详细信息
  • -z 不发送包给对方
  • -w 后面是数字,秒,表示多少时间结束,不等太长时间。
  • -u udp 协议,默认是tcp。上图可以看到。如果是dns端口检测,用u
nc -zv -w 2 -u 114.114.114.114 53
Connection to 114.114.114.114 port 53 [udp/domain] succeeded!

参考文章

  • https://www.jianshu.com/p/0f39dbd911ef
Apr 132021
 

儿子学python,需要用pygame,我就在mac上装一下。以前python版本是3.7,装完,python版本升级到3.9.

pip3 install pygame

这就装完了。测试一下。

python3 -m pygame.examples.aliens

能看到一个demo,比较有意思。

shake@ShakedeMacBook-Air ~ % python --version
Python 2.7.16
shake@ShakedeMacBook-Air ~ % python3 --version
Python 3.9.2
shake@ShakedeMacBook-Air ~ % 

查看一下安装的版本

shake@ShakedeMacBook-Air ~ % python3
Python 3.9.2 (v3.9.2:1a79785e3e, Feb 19 2021, 09:06:10) 
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pygame
pygame 2.0.1 (SDL 2.0.14, Python 3.9.2)
Hello from the pygame community. https://www.pygame.org/contribute.html
>>> exit ()
Apr 022021
 

最近做镜像,折腾repo。记录一下,发现各个repo,居然最好用,体贴的是腾讯云。

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/repo/centos6_base.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.cloud.tencent.com/repo/epel-6.repo
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/repo/centos7_base.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.cloud.tencent.com/repo/epel-7.repo
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.cloud.tencent.com/repo/centos8_base.repo

这样就基本搞定。不过有时候你会遇到key的问题。所以你可以

rpm --import https://mirrors.cloud.tencent.com/epel/RPM-GPG-KEY-EPEL-6'

这是epel,可以参考。这样基本就没啥问题。

  • https://mirrors.cloud.tencent.com/help/centos.html