陈沙克

May 172021
 

已经讨论了很久这套组合,这次动手验证一遍。流程还是非常顺利。从0开始,到部署完成kubesphere,基本2个小时可以搞定,主要是考验带宽。后续再慢慢研究离线安装。

青云设置

青云新的Dashboard改动很多,功能也真的比以前增加了很多很多。我也是需要花时间熟悉一下。其实我以前在青云上测试,基本上一个虚拟机来测试,这次至少要用3个虚拟机,需要vpc来玩,整理一下这个过程

  • 创建一个项目,kubeOperOperator and KubeSphere。青云引入了项目的概念,有点类似Azure的资源组,你可以在项目里看到所用到的资源。
  • 创建一个安全组,安全组有一个选项,组内互通,这个我打开的,应该是比较方便。为了方便,我打开所有的端口。
  • 创建vpc,指定网段,192.168.0.0/16, 创建子网,网段 192.168.10.0/16
  • 公网的ip,绑定在vpc上
  • 创建一个。4core,8g内存,60G存储的虚拟机,CentOS 7.9,用来部署kubeoperator。ip地址,指定 192.168.10.10
  • vpc上,进行端口映射,22,80,映射到192.168.10.10 这台虚拟机上。后续还需要映射30880端口到master节点到内网ip,这里是192.168.10.30
  • NFS Server 也部署在kubeoperator机器上。
  • 创建3台机器,master配置:4core,8G,60G存储,work节点,2core,4G,20G存储。

KubeOperator

安装

对于kubeOperator安装,倒是比较简单,一条命令就搞定。

curl -sSL https://github.com/KubeOperator/KubeOperator/releases/latest/download/quick_start.sh | sh

4M带宽,大概需要20分钟下载。组件都是部署在Dcoker里,通过compose来实现部署到机器上。

地址: http://<ko服务器_ip>:80
用户名: admin
密码: kubeoperator@admin123

相关命令

koctl status
koctl --help

设置

如果你是通过手动的方式来安装的话,倒是比较简单。这里就不截图,只是记录一个过程

  • 设置仓库地址,就是kubeoperator的地址
  • 创建凭证,就是节点root的密码
  • 创建项目
  • 添加主机,一台是master,一台是work节点,这两台机器,提前在青云平台创建。
  • 项目把主机添加到项目里
  • 项目里创建集群:这就是一个K8S集群。
  • k8s部署完毕,进入集群,设置存储:NFS
  • 需要通过kubectl,把NFS存储设置成默认存储,这样就可以顺利进行KubeSphere的安装

你可以在访问创建的集群里玩玩k8s。

安装NFS server

mkdir /data/nfs -p
yum install -y nfs-utils
vim /etc/exports
/data/nfs *(rw,sync,no_root_squash)

systemctl enable --now rpcbind.service
systemctl enable --now nfs-server.service

在部署的cluster里,配置nfs存储,查看存储的sc。你需要设置default 的存储。

> kubectl get sc
NAME              PROVISIONER   RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
mynfs (default)   nas           Delete          Immediate           false                  28m

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

KubeSphere

安装

KubeSphere的安装,也很简单。因为KubeOperator 提供web的kubectl,直接就可以进行kubesphere的安装

kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.1.0/kubesphere-installer.yaml
   
kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.1.0/cluster-configuration.yaml

等着就可以,可以通过命令,查看安装的进度。

kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f

安装过程,如果看到出现错误,例如我没设置默认存储,你配置完成默认存储后,你需要重启pod,继续安装

kubectl -n kubesphere-system rollout restart deploy

查看登陆地址

kubectl get svc/ks-console -n kubesphere-system

kubesphere web 端口是 30880,并通过 NodePort (IP:30880) 使用默认帐户和密码 (admin/P@88w0rd) 访问 Web 控制台。记得去vpc上做30880的端口映射。

配置

默认的安装,是没有包括devops的相关组件,这个可以通过web方式启用,也可以通过修改配置文件搞定。

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 ()