陈沙克

May 282021
 

本周参加了一个培训,直接就是上机练习。整个流程,基本是我见过,体验过最好的,记录一下。以前IT培训有一个规律,很难超过50人,所以也就导致当年新东方尝试做IT培训,复制英语培训的上失败。主要是上机实验环节,如何能确保100人,10000人都能完成实验,在指定的时间内。这是非常有挑战的事情。

阿里云香港虚拟机

老师提前用terraform去阿里云香港创建了20多个虚拟机,还采用密钥登陆,每个虚拟机,分配一个公网ip。整个过程,其实还是非常方便的。

老师其实还是提前上虚拟机里,把实验需要要做的事情,用ansible处理了一下,这样学员登陆上去,就可以直接使用。

老师甚至把环境变量都帮忙配置好。整个实验,包括k8s安装,服务网格的安装,都是非常流畅。

微信群和腾讯文档

培训,一般都会建议一个微信群,不过这个群,还是很有创新,公告包括wifi,你登陆使用的密钥的下载地址。这样你进群后,就基本知道如何做了。

这次上课的整个过程,做笔记上最爽,基于腾讯文档,大家协同。由于有不少代码,如果出错,可以直接复制文档里,正确的代码。

所以20多人,基本大家都可以把实验做完,慢慢体会就可以。

这次没有使用腾讯会议,如果我们用腾讯会议,远程,完全也是可以。

改进

酒店里的wifi,插线板,都是需要提前考虑。对于mac电脑,好处是压根不需要考虑电源的问题。投影的清晰度,分享演讲的ppt。

May 222021
 

给儿子报了python的编程课,作业变成我的作业,每周是必须完成的,这可以算是经典的自己给自己挖坑。

这段代码,实现一个方块,可以用键盘操作,到处走,还能用鼠标进行操作,更改颜色。

真的是吃饭的时候,才想到办法,让改变颜色的操作wait 一下,才能实现那种更改颜色的效果。鼠标点方块里,改变颜色,鼠标在外面,就跟着走,按空格键,方块会变大。

import pygame,time
from random import randint as rd

pygame.init()

screen = pygame.display.set_mode([640,480])
pygame.key.set_repeat(20)
r = pygame.Rect(0,0,50,50)

def draw():
    screen.fill([255,255,255])
    pygame.draw.rect(screen,(0,128,0),r)
    pygame.display.flip()

def keydown(i):
    if i.key == pygame.K_UP:
        r.y-=10
    if i.key == pygame.K_DOWN:
        r.y+=10
    if i.key == pygame.K_RIGHT:
        r.x+=10
    if i.key == pygame.K_LEFT:
        r.x-=10
    if i.key == pygame.K_SPACE:
        r.h+=10
        r.w+=10

def mousedown():
    b=pygame.mouse.get_pos()    
    if r.x<b[0]<r.x+r.w and r.y<b[1]<r.y+r.h :       
        pygame.draw.rect(screen,(rd(0,255),rd(0,255),rd(0,255)),r)
        pygame.display.flip()
        pygame.time.wait(1000)

    else:
        r.x=b[0]
        r.y=b[1]   
   
a=1
while a ==1:
    draw()

    e = pygame.event.get()
    for i in e:
        if i.type == pygame.QUIT:
            a = 0     
        if i.type == pygame.KEYDOWN:
            keydown(i)
        if i.type == pygame.MOUSEBUTTONDOWN:
            mousedown()


pygame.quit()
     
May 182021
 

要上传一个文件到阿里云的对象存储,7个G,所以就只能用客户端。专门研究了一下。

OSS控制台客户端Mac版,做阿里云上就可以找到,免费。所以就是在mac安装就可以。

需要输入账号的创建 AccessKey。填入 AccessKey ID,AccessKey Secret,就可以开始使用。

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就无法看到这个进程。