听说Go你狠屌?

118 阅读4分钟

Go安装 VsCode GoLand Go在线中文API Go依赖包

  1. 安装Go语言环境
  2. go build test.go,生成go.exe文件
  3. 获得执行结果 执行go.exe或者go run test.go
  4. 批量导入包、全局变量(import("fmt")
  5. 算术运算符、赋值运算符、关系运算符、逻辑运算符、位运算符、其它运算符(&取内存地址、*根据根村地址取值)
  6. 流程控制
        count := 100
	if count < 30 {
		fmt.Println("数量小于20了!")
	} else if count >10 && count < 15 {
	   fmt.Println("数量中间态了!")
	} else {
	   fmt.Println("数量未知态了!")
	}


	switch count%2 {
		case 2 :
			fmt.Println("2....")
		case 1 :
			fmt.Println("1....")
		case 0 :
			fmt.Println("0....")
		default :
			fmt.Println("玛德....")
	}
        // for循环
	inc:=10
	var sum,tmpInc = sumCount(inc)
	fmt.Println("sum:", sum, tmpInc)
        
        type myInt int
        type mySumCount sumCount
        sC := sumCount
        
        // 支持多返回值,也支持返回值命名
        func sumCount (inc int) (a int,b int) {
            sum := 0
            for tmpInc := 0;tmpInc<inc;tmpInc++ {
                    fmt.Println("tmpInc:", tmpInc)
                    sum += tmpInc
            }
	return sum,inc
            sum := 0
                for tmpInc := 0;tmpInc<inc;tmpInc++ {
                        fmt.Println("tmpInc:", tmpInc)
                        sum += tmpInc
                }
            a := sum
            b := tmpInc
	return
        
        
}

  1. 循环语句
  2. 函数(不支持重载、函数可以赋值给到一个变量、别名)
  3. 包(package main 与 main函数必须在一起;函数名、变量名大写,可以被其它包访问;同级别源文件包命名必须一致)
  4. 错误处理(defer、recover();自定义错误值errors.New())
  5. 数组(var nums [5]int, nums[0] = 1;)
  6. 切片(slice := make([]int,2,3))
  7. 映射(tmpCustom := make(map[int]string,10))
  8. 面向对象
  9. 依赖管理(go mod tidy; go mod init test; go get url)
  10. gorm(增删改查持久化,gorm.io/zh_CN/docs/… mysql日志记录(gorm.io/zh_CN/docs/…
  11. gin(web框架,pkg.go.dev/github.com/…
  12. goproxy(Go代理,goproxy.cn/)
  13. viper(读取配置文件,pkg.go.dev/github.com/…
  14. go 的命令都存放在 $HOME/go/bin下面,swag也是在这个里面,如果执行swag init提示not found,则加上目录前缀来执行,gin-swagger,先把swag引入(pkg.go.dev/github.com/…
  15. gcc文件下载(sourceforge.net/projects/mi…
  16. govalidator
  17. 安装sealos、k8s集群用来管理go需要的环境 a. hostnamectl 设置主机名称 b. 设置局域网Ip地址(时钟服务器) c. 关闭防火墙sestatus ufw d. 安装sealos&启动k8s集群 e. kubectl get nodes f. kuboard云平台管理工具 g. kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers
  18. 打开网络代理的重要性
大概的意思就是无法下载https://proxy.golang.org/github.com/%21burnt%21sushi/toml/@v/v0.3.1.mod包超时了。

二、解决方法

通过网上查找资料,了解可能是需要终端打开代理,因此执行下面两个指令就可以打开:

go env -w GO111MODULE=on

go env -w GOPROXY=https://goproxy.io,direct
  1. k8s安装
设置防火墙为 Iptables 并设置空规则  
【所有节点都执行】
systemctl stop firewalld
systemctl disable firewalld
yum -y install iptables-services ipvsadm;systemctl start iptables;systemctl enable iptables;iptables -F;service iptables save

关闭selinux  
【所有节点都执行】
setenforce 0
vi /etc/selinux/config
修改SETLINUX=disabled

配置主机名  
【所有节点都执行】
hostnamectl set-hostname 主机名

cat > /etc/hosts <<-'EOF' 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.56.101 k8s-master1 192.168.56.102 k8s-master2 192.168.56.103 k8s-master3 192.168.56.104 k8s-node1 192.168.56.105 k8s-node2 EOF

配置时间同步
【所有节点都执行】  
选择一个节点作为服务端,剩下的作为客户端  
master1为时间服务器的服务端  
其他的为时间服务器的客户端
1)配置k8s-master1
yum install chrony -y
vi /etc/chrony.conf
修改三项
server 127.127.1.0 iburst
allow 192.168.56.0/24
local stratum 10

systemctl start chronyd
systemctl enable chronyd
ss -unl | grep 123

2)配置其它节点
yum install chrony -y
vi /etc/chrony.conf
server 192.168.56.101 iburst

systemctl start chronyd
systemctl enable chronyd

chronyc sources

关闭swap交换分区
【所有节点都执行】
chronyc sources
chronyc -a makestep
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab

调整内核参数
【所有节点都执行】
yum -y upgrade systemd
systemctl stop postfix && systemctl disable postfix
cat > kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
EOF

cp kubernetes.conf /etc/sysctl.d/kubernetes.conf
sysctl -p /etc/sysctl.d/kubernetes.conf
忽略报错

设置rsyslogd和systemd journald
【所有节点都执行】
mkdir /var/log/journal # 持久化保存日志的目录
mkdir /etc/systemd/journald.conf.d
cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
[Journal]
# 持久化保存到磁盘
Storage=persistent

# 压缩历史日志
Compress=yes

SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000

# 最大占用空间 10G
SystemMaxUse=10G

# 单日志文件最大 200M
SystemMaxFileSize=200M

# 日志保存时间 2 周
MaxRetentionSec=2week

# 不将日志转发到 syslog
ForwardToSyslog=no
EOF

systemctl restart systemd-journald

升级系统内核
【所有节点都执行】
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
yum --enablerepo=elrepo-kernel install -y kernel-lt
grep initrd16 /boot/grub2/grub.cfg
grub2-set-default 0

reboot

kube-proxy开启ipvs的前置条件
【所有节点都执行】
modprobe br_netfilter

cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF

chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack


-------以上步骤完成了k8s系统的基础配置-------
kubernetes安装
wget -c https://sealyun.oss-cn-beijing.aliyuncs.com/latest/sealos
wget -c https://sealyun.oss-cn-beijing.aliyuncs.com/05a3db657821277f5f3b92d834bbaf98-v1.22.0/kube1.22.0.tar.gz

上传下载工具
yum install -y lrzsz
选择文件上传
rz -E

tar zxvf sealos.tar.gz

chmod +x sealos && mv sealos /usr/bin

sealos init --passwd '1qazaq1!#' \
    --master 192.168.56.102 --master 192.168.56.103 --master 192.168.56.101 \
    --node 192.168.56.104 \
    --pkg-url /root/kube1.22.0.tar.gz \
    --version v1.22.0

kubeadm reset
kubeadm init --cri-socket=unix:///var/run/cri-dockerd.sock --pod-network-cidr=10.244.0.0/16

kubeadm init --pod-network-cidr=192.168.56.0/24 --image-repository=registry.aliyuncs.com/google_containers

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

kubectl taint nodes --all node-role.kubernetes.io/control-plane-
kubectl taint nodes --all node-role.kubernetes.io/master-

kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl > /dev/null
echo 'alias k=kubectl' >>~/.bashrc
echo 'complete -o default -F __start_kubectl k' >>~/.bashrc
-------以上步骤仅供参考命令大概意思,最终能否成功,全凭运气-------

【理论上一次性成功】安装单机版kubernetes
sealos run labring/kubernetes:v1.25.0 labring/helm:v3.8.2 labring/calico:v3.24.1 --single
获取节点
kubectl get pods -A
安装docker环境,[参照官网来做吧](https://docs.docker.com/desktop/install/linux-install/),正常执行命令就好
镜像提速,[参照Kuboard官网来做](https://www.kuboard.cn/install/docker-mirror.html#%E4%BF%AE%E6%94%B9%E9%95%9C%E5%83%8F%E4%BB%93%E5%BA%93-mirror-%E5%9C%B0%E5%9D%80)
我们要安装Kuboard,[参照官网哈](https://www.kuboard.cn/install/v3/install-built-in.html#%E9%83%A8%E7%BD%B2%E8%AE%A1%E5%88%92),不是KuboardSpray,这个一定要搞对了~
此时,你就可以访问Kuboard客户端页面了,然后导入Kubernetes集群,这里有个小插曲,因为我是用的云服务商,这里的APIServer地址一直在报错,内容是Kuboard不能连接APIServer,报错如下图,这里APIServer 地址要填写服务器公网IP就解决了;
![62602083c90de1c0aa279d451dbf45b.png](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/aa0f30b9ae41435fbcd1df3a28ec7aca~tplv-k3u1fbpfcp-watermark.image?)

经历了上面步骤,你的Kuboarad客户端按理就已经正常运行了~从这里开始保证单机版本的Kubernetes可以正常安装应用...
因为是单机部署,这时候的master节点是有污点,不能作为部署节点部署使用的

去污点
kubectl get nodes 发现主节点 k8s-master是notready状态,这块我当时状态是ready,但是因为在安装应用的时候,提示无法安装,这才想到可能是因为单节点master无法作为部署节点使用

查看污点策略 
kubectl get no -o yaml | grep taint -A 5
发现master节点都是NoSchedule

去除污点,使主节点能部署pod,下面的命令是去除所有的污点
kubectl taint nodes --all node-role.kubernetes.io/control-plane-

再次查看,如果没有任何输出则污点去除成功
kubectl get no -o yaml | grep taint -A 5

查看pod节点是否成功启动,所有节点都是running
kubectl get pods --all-namespaces

清理集群
sealos clean --all -f




安装NFS文件系统
【全部节点都执行】
yum install nfs-utils rpcbind -y

【Server节点执行】
创建用户nfsupload:nfsupload的user/group用来给NFS client往共享目录写入数据

检查210的user id 和 group id 是否存在
cat /etc/passwd | grep 210

创建nfsupload:nfsupload的User:Group,且user id和group id为210
groupadd -g 210 nfsupload
# -M, --no-create-home 不创建用户目录
useradd -g 210 -u 210 -M nfsupload

创建要共享的目录是根目录,并将该目录的所有者设置为nfsupload:nfsupload
mkdir -p /mnt/data/nfs
chown -R nfsupload:nfsupload /mnt/data/nfs

编辑/etc/exports,添加共享跟目录的共享规则
# 限制只有172.31.240.0/24才可以访问
# rw 有读写权限
# all_squash 所有NFS client的用户名都会被压缩成匿名用户
# anonuid=210,anongid=210 匿名用户的user id和group id为210
/mnt/data/nfs 172.31.240.0/24(rw,all_squash,anonuid=210,anongid=210)
运行`exportfs -r`更新全部共享规则。
运行`exportfs -v` 可以查看共享了哪些目录。
启动NFS server服务:
systemctl enable nfs 
systemctl enable rpcbind
systemctl start nfs
systemctl start rpcbind

【client节点执行】
检查NFS server的共享规则:
showmount -e 172.31.240.127
挂载NFS server的共享根目录:
mkdir -p /mnt/nfsdata
mount -t nfs 172.31.240.127:/mnt/data/nfs /mnt/nfsdata
运行`df -hk`查看挂载情况
可以运行`umount -l /mnt/nfsdata` 来卸载目录。

【测试NFS】
在NFS client上,测试往共享根目录写入文件
cd /mnt/nfsdata
touch test.txt
在NFS server上,查看文件
cd /mnt/data/nfs
ls -ltra
可以看到文件可以创建成功,且user/group都为`nfsupload`。

【在K8s Pod中使用NFS卷示例】
在NFS server的共享根目录下创建子目录
mkdir -p /mnt/data/nfs/kuard/data
如果共享目录不存在,在创建Pod时挂载会失败,Pod会一直处在ContainerCreating状态。可通过`kubectl describe pods/<pod-name>` 查看详细错误信息。
通过kuboard来创建存储类


设置静态IP(推荐)
虚拟机网卡多选择一块,仅主机Host-Only模式,如果是k8s-master节点,请确保第一块网卡是仅主机模式网卡,具体原因是k8s默认使用第一块网卡作为其它节点扩展交互使用,导致无法连接其它节点
定义IP
vi /etc/sysconfig/network-scripts/ifcfg-ens0s8
//修改以下内容
BOOTPROTO=static  //启用静态IP地址
ONBOOT=yes      //开启自动启用网络连接
 
//添加vmnet8的子网掩码和网关,ip要保证在192.168.126.x,还要保证唯一性
IPADDR=192.168.126.124    //设置IP地址
NETMASK=255.255.255.0   //子网掩码
GATEWAY=192.168.126.2   //设置网关

设置DNS地址
vi /etc/resolv.conf    //编辑 resolv.conf文件 
nameserver 114.114.114.114   //添加DNS地址

重启网络服务
systemctl restart network

测试网络是否连通
ip addr // 查看与自己设置是否一致
ping 公网域名 // 测试网络联通

Centos7镜像下载地址
https://mirrors.bfsu.edu.cn/centos/7.9.2009/isos/x86_64/

image.png