集群配置: centos7.7 64位
ip | 主机名 |
---|---|
10.0.4.20 | vip |
10.0.4.27 | sh-master-01 |
10.0.4.46 | sh-master-02 |
10.0.4.47 | sh-master-02 |
10.0.4.14 | sh-node-01 |
10.0.4.2 | sh-node-02 |
10.0.4.6 | sh-node-03 |
10.0.4.4 | sh-node-04 |
10.0.4.13 | sh-node-05 |
环境为kubernets集群1.18.6,参照 https://duiniwukenaihe.github.io/2020/07/22/tencent-slb-kubeadm-ha/在腾讯云上搭建。参照https://duiniwukenaihe.github.io/2020/07/23/kubernetes-csi-tencentcloud-cbs/完成 cbs云硬盘块存储集成。现在想把cos作为存储试一下。
https://github.com/TencentCloud/kubernetes-csi-tencentcloud
现在github会非常卡你懂的,最好还是国外服务器下载了。
参照https://github.com/TencentCloud/kubernetes-csi-tencentcloud/blob/master/docs/README_COSFS.md,我的kubernets集群是1.18.6。按照https://github.com/TencentCloud/kubernetes-csi-tencentcloud/edit/master/docs/README_CBS_zhCN.md的前置特性KubeletPluginsWatcher支持到1.12 我就不去考虑了。如下:
注意:
在讲述前置要求之前,对于各组件设置参数启动项有些要注意的地方:
特性 | 默认值 | 阶段 | 起始 | 直到 |
---|---|---|---|---|
VolumeSnapshotDataSource |
true |
Beta | 1.17 | - |
CSINodeInfo |
true |
Beta | 1.14 | 1.16 |
CSIDriverRegistry |
true |
Beta | 1.14 | 1.17 |
KubeletPluginsWatcher |
true |
Beta | 1.12 | 1.12 |
VolumeScheduling |
true |
Beta | 1.10 | 1.12 |
集群配置: centos7.7 64位
ip | 主机名 |
---|---|
10.0.4.20 | vip |
10.0.4.27 | sh-master-01 |
10.0.4.46 | sh-master-02 |
10.0.4.47 | sh-master-02 |
10.0.4.14 | sh-node-01 |
10.0.4.2 | sh-node-02 |
10.0.4.6 | sh-node-03 |
10.0.4.4 | sh-node-04 |
10.0.4.13 | sh-node-05 |
环境为kubernets集群1.18.6,参照 https://duiniwukenaihe.github.io/2020/07/22/tencent-slb-kubeadm-ha/在腾讯云上搭建。过去自己搭建过rook-ceph但是版本升级或者节点挂掉出现了各种问题,而且ceph的规划什么的 自己也掌握的不好,正好有腾讯云自己开源的kubernetes-csi-tencentcloud组件 就准备使用他集成做kubernets集群的默认storageclass了。
https://github.com/TencentCloud/kubernetes-csi-tencentcloud
现在github会非常卡你懂的,最好还是国外服务器下载了。
参照https://github.com/TencentCloud/kubernetes-csi-tencentcloud/blob/master/docs/README_CBS_zhCN.md,我的kubernets集群是1.18.6。 按照显性设置版本要求在kubelet apiserver controller-manager scheduler 配置文件添加–feature-gates=VolumeSnapshotDataSource=true配置:
cd /etc/kubernetes/manifests,修改三个master的 apiserver controller scheduler配置文件如下:
所有节点 包括master与work节点,进入/etc/sysconfig目录修改kubelet配置文件如下:
所有节点重启kubelet :
systemctl restart kubelet
步骤3-6基本就是按照腾讯云文档来就可以了,唯一可怕的就少镜像被墙….最好把镜像打包放到国内镜像仓库,然后修改配置文件。然后还有csi-node的apiVersion要修改一下呢,直接修改为apps/v1。
集群配置: centos7.7 64位
ip | 主机名 |
---|---|
10.0.4.20 | vip |
10.0.4.27 | sh-master-01 |
10.0.4.46 | sh-master-02 |
10.0.4.47 | sh-master-02 |
10.0.4.14 | sh-node-01 |
10.0.4.2 | sh-node-02 |
10.0.4.6 | sh-node-03 |
10.0.4.4 | sh-node-04 |
10.0.4.13 | sh-node-05 |
大致过程与1.16差不多,自己写下日志记录一遍。然后今年想深入集成一下腾讯云的cbs.不要问我为什么不用腾讯云的tke.首先每个slb到现在应该还是只可以挂载一个ssl证书的,业务比较少,我不想管理多个负载均衡,然后负载均衡的策略也比较坑,偶尔tke集群slb测还经常更新。还有上传文件大小限制这样的策略。使用traefik的tcp代理很方便解决这些问题。而且我还是比较喜欢原生不喜欢定制。
centos7默认内核为3.10版本,一般是建议把内核更新一下。
##导入key
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
##添加elrepo源
rpm -ivh https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
##查看可更新kernel版本
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
##关于kernel的版本 ml(mainline,主线最新版) lt(长期支持版本)可参照https://www.cnblogs.com/clsn/p/10925653.html。
## 安装长期支持版本
yum --enablerepo=elrepo-kernel -y install kernel-lt
## 查看grub2启动选择项
sudo awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
##修改grub2.conf使内核生效
grub2-set-default 0
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot
##验证内核
uname -a
##删除旧内核
package-cleanup --oldkernels
swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab
setenforce 0
sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/sysconfig/selinux
sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
sed -i "s/^SELINUX=permissive/SELINUX=disabled/g" /etc/sysconfig/selinux
sed -i "s/^SELINUX=permissive/SELINUX=disabled/g" /etc/selinux/config
echo "* soft nofile 65536" >> /etc/security/limits.conf
echo "* hard nofile 65536" >> /etc/security/limits.conf
echo "* soft nproc 65536" >> /etc/security/limits.conf
echo "* hard nproc 65536" >> /etc/security/limits.conf
echo "* soft memlock unlimited" >> /etc/security/limits.conf
echo "* hard memlock unlimited" >> /etc/security/limits.conf
cat <<EOF > /etc/sysctl.d/k8s.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
net.ipv4.neigh.default.gc_stale_time = 120
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
net.ipv4.ip_forward = 1
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
# 要求iptables不对bridge的数据进行处理
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables = 1
net.netfilter.nf_conntrack_max = 2310720
fs.inotify.max_user_watches=89100
fs.may_detach_mounts = 1
fs.file-max = 52706963
fs.nr_open = 52706963
vm.overcommit_memory=1
vm.panic_on_oom=0
vm.swappiness = 0
EOF
modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf
sysctl -p /etc/sysctl.d/k8s.conf
注意:由于kube-proxy使用ipvs的话为了防止timeout需要设置下tcp参数
cat <<EOF >> /etc/sysctl.d/k8s.conf
# https://github.com/moby/moby/issues/31208
# ipvsadm -l --timout
# 修复ipvs模式下长连接timeout问题 小于900即可
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 10
EOF
sysctl --system
:> /etc/modules-load.d/ipvs.conf
module=(
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
br_netfilter
)
for kernel_module in ${module[@]};do
/sbin/modinfo -F filename $kernel_module |& grep -qv ERROR && echo $kernel_module >> /etc/modules-load.d/ipvs.conf || :
done
启动该模块管理服务
systemctl daemon-reload
systemctl enable --now systemd-modules-load.service
lsmod | grep ip_v
sed -ri 's/^\$ModLoad imjournal/#&/' /etc/rsyslog.conf
sed -ri 's/^\$IMJournalStateFile/#&/' /etc/rsyslog.conf
sed -ri 's/^#(DefaultLimitCORE)=/\1=100000/' /etc/systemd/system.conf
sed -ri 's/^#(DefaultLimitNOFILE)=/\1=100000/' /etc/systemd/system.conf
sed -ri 's/^#(UseDNS )yes/\1no/' /etc/ssh/sshd_config
journalctl --vacuum-size=20M
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
安装依赖包
yum install -y epel-release
yum install -y yum-utils device-mapper-persistent-data lvm2 net-tools conntrack-tools wget vim ntpdate libseccomp libtool-ltdl
安装bash命令提示
yum install -y bash-argsparse bash-completion bash-#completion-extras
安装docker kubeadm:
yum install docker-ce -y
#配置镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://lrpol8ec.mirror.aliyuncs.com"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
添加个日志最多值,否则有的苦了,入坑体验过了。docker要不要开机启动呢?我后面安装rook ceph 开机重新启动了老有错误,因为没有将节点设置为cordon,但是也懒了, 我就没有设置为开机启动。故开机启动后在启动docker了
#查看yum源中可支持版本
yum list --showduplicates kubeadm --disableexcludes=kubernetes
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
##可指定自己要安装的版本
#yum install -y kubelet-1.18.6 kubeadmt-1.18.6 kubectlt-1.18.6 --disableexcludes=kubernetes
systemctl enable kubelet
注:slb内网传统型负载均衡使用了。尝试了两种方式:
1. slb+haproxy slb 绑定三台master6443代理后端haproxy 8443端口。(kubeadm-config.yaml配置文件中controlPlaneEndpoint: "10.0.4.20:6443")。
2. keepalived +haproxy 配置slb地址(三台server设置不同权重,kubeadm-config.yaml配置文件中controlPlaneEndpoint: "10.0.4.20:8443")。
个人来说强迫症 就喜欢6443所以就用了第一种。
yum install -y haproxy
cat <<EOF > /etc/haproxy/haproxy.cfg
#---------------------------------------------------------------------
# Example configuration for a possible web application. See the
# full configuration options online.
#
# http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
#
#---------------------------------------------------------------------
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
# to have these messages end up in /var/log/haproxy.log you will
# need to:
#
# 1) configure syslog to accept network log events. This is done
# by adding the '-r' option to the SYSLOGD_OPTIONS in
# /etc/sysconfig/syslog
#
# 2) configure local2 events to go to the /var/log/haproxy.log
# file. A line like the following can be added to
# /etc/sysconfig/syslog
#
# local2.* /var/log/haproxy.log
#
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode tcp
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend kubernetes
bind *:8443 #配置端口为8443
mode tcp
default_backend kubernetes
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
backend kubernetes #后端服务器,也就是说访问192.168.255.140:8443会将请求转发到后端的三台,这样就实现了负载均衡
balance roundrobin
server master1 10.0.4.27:6443 check maxconn 2000
server master2 10.0.4.46:6443 check maxconn 2000
server master3 10.0.4.47:6443 check maxconn 2000
EOF
systemctl enable haproxy && systemctl start haproxy && systemctl status haproxy
腾讯云slb负载均衡最终还是用了传统型,监听器tcp 6443代理后端三台haproxy 8443端口
master1节点
cat <<EOF > kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
networking:
serviceSubnet: "172.251.0.0/16" #设置svc网段
podSubnet: "172.252.0.0/16" #设置Pod网段
dnsDomain: "layabox.sh"
kubernetesVersion: "v1.18.6" #设置安装版本
controlPlaneEndpoint: "10.0.4.20:6443" #设置相关API VIP地址
dns:
type: CoreDNS
apiServer:
certSANs:
- sh-master-01
- sh-master-02
- sh-master-03
- sh-master.k8s.io
- 127.0.0.1
- 10.0.4.27
- 10.0.4.46
- 10.0.4.47
- 10.0.4.20
timeoutForControlPlane: 4m0s
certificatesDir: "/etc/kubernetes/pki"
imageRepository: "ccr.ccs.tencentyun.com/k8s_containers" #国内貌似没有最新的镜像库,自己同步到自己镜像仓库了,开始没有将namespace设置为公开,后期无法设置对外,抱歉。
etcd:
local:
dataDir: /var/lib/etcd
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
SupportIPVSProxyMode: true
mode: ipvs #使用ipvs方式
EOF
kubeadm init --config kubeadm-config.yaml
mkdir -p $HOME/.kube
sudo \cp /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
按照输出master02 ,master03节点加入集群
将master01 /etc/kubernetes/pki目录下ca.* sa.* front-proxy-ca.* etcd/ca* 打包分发到master02,master03 /etc/kubernetes/pki目录下
kubeadm join 10.0.4.20:6443 --token jiprvz.0rkovt1gx3d658j --discovery-token-ca-cert-hash sha256:5d631bb4bdce033163037ef21f663c88e058e70c6c362c9c5ccb1a92095 --control-plane --certificate-key
然后同master01一样执行一遍下面的命令:
mkdir -p $HOME/.kube
sudo \cp /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
注: key都胡乱输入的这里没有用自己的。此时任意一台master执行kubectl get nodes STATUS一列应该都是NOTReady.
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
修改配置文件中Network 为自己设置的子网,我这里是172.252.0.0/16
kubectl apply -f kube-flannel.yml
然后基本发现 master节点都已经redeay
### 二 . work节点j加入集群
kubeadm join 192.168.3.9:6443 --token 3o6dy0.9gbbfuf55xiloe9d --discovery-token-ca-cert-hash sha256:5d631bb4bdce01dcad51163037ef21f663c88e058e70c6c362c9c5ccb1a92095
OK集群算是初始搭建完了,不知道跑一遍咋样,我的是正常跑起来了。
确认集群节点是否ready。常见问题,集群开启了ipvs,但是我iptables没有关闭,然后节点一直加入不了,看了眼防火墙开着呢没有关闭规则。由于主机都是云主机,就开启了安全组策略,把防火墙都关闭了。如果是其他环境一定记得检查防火墙策略。
kubectl edit cm kube-proxy -n kube-system
configmap/kube-proxy edited
#修改如下
kind: MasterConfiguration
apiVersion: kubeadm.k8s.io/v1alpha1
...
ipvs:
excludeCIDRs: null
minSyncPeriod: 0s
scheduler: ""
syncPeriod: 30s
kind: KubeProxyConfiguration
metricsBindAddress: 127.0.0.1:10249
mode: "ipvs" #修改
kubectl get pod -n kube-system | grep kube-proxy |awk '{system("kubectl delete pod "$1" -n kube-system")}'
貌似应该就跑起来了,然后后面应该还要做的:
- etcd的备份,虽然有三个master节点 数据无价,还是做下etcd的备份要好。
- pods 可能都running了 但是最后还是看下日志,肯能有些小的失误,看日志是个好习惯的,老版本糊里糊涂搭建的时候kubernetes插件pod打了一大堆日志 虽然可以使用,但是还是要追求下完美的。由此可见搭建日志采集系统还是很有必要的。
- work节点最好打上标签,给服务设置亲和性和反亲和性。资源的调度使用值貌似可以设置的?否则后面有的work会出现pods一直创建中,打标签合理规划资源还是很有必要的。
集群配置: 初始集群环境kubeadm 1.16.3
ip | 自定义域名 | 主机名 |
---|---|---|
192.168.3.8 | master.k8s.io | k8s-vip |
192.168.3.10 | master01.k8s.io | k8s-master-01 |
192.168.3.5 | master02.k8s.io | k8s-master-02 |
192.168.3.12 | master03.k8s.io | k8s-master-03 |
192.168.3.6 | node01.k8s.io | k8s-node-01 |
192.168.3.2 | node02.k8s.io | k8s-node-02 |
192.168.3.4 | node03.k8s.io | k8s-node-03 |
traefik2的初始环境https://duiniwukenaihe.github.io/2019/10/17/k8s-traefik2/已经安装,现在的默认版本是2.1 。新版本增加了 TraefikService,的支持,具体可以参考https://wanzi.im/posts/2019/12/kubernetes-traefik-v2.1-deploy/。测试没有充足直接用于了生产环境,然后发现微信小程序中应用出现问题如下图:
很刺激 查了下 貌似微信小程序支持的tls默认是1.2我的traefik默认的tls是1.3……然后有简单使用的腾讯云api的网关也默认都是1.2的直接指定的后端域名tls1.3的访问也出现这种状况了….。下面还是记录下处理过程吧.
证书我都是用的腾讯云的购买的亚洲诚信的。通过这个网站可以查看自己的网站安全等级,另外他还可以给一些安全方面的建议。
通过评级测试我的域名仅为B,而且证书支持了tls1.3
OK,下面先把自己的traefik升级到2.1增加TraefikService的支持吧 .
cat <<EOF | kubectl apply -f -
apiVersion: traefik.containo.us/v1alpha1
kind: TLSOption
metadata:
name: mytlsoption
namespaces: kube-system
spec:
maxVersion: VersionTLS12
snistrict: true
ciphersuites:
- TLS_ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE
EOF
注:namespace就写kube-system了,哈哈当然其实我写的是release测试的其实.....与文不符哈。
cat <<EOF | kubectl apply -f -
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: hsts
namespaces: kube-system
spec:
headers:
stsSeconds: 31536000
EOF
注:默认就先增加下hsts了 其实其他的middleware也可以加下。
cat <<EOF> traefik-dashboard-route-https.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
namespace: kube-system
name: traefik-dashboard-route-https
spec:
entryPoints:
- websecure
routes:
- match: Host(\`traefik.saynaihe.com\`)
kind: Rule
services:
- name: traefik
port: 8080
tls:
secretName: all-saynaihe-com
options:
name: mytlsoption
middlewares:
- name: hsts
EOF
看别人写的例子tls的配置都写在最下面了 我也就抄写一下了。
以上文图很多不符啊,但是过程就是这样的,可以参考一下。至于PCI DSS不合规,我就忽略了因为咱也不是支付行业,tls1.0也没有必要屏蔽了就这样吧
集群配置: 初始集群环境kubeadm 1.16.3
ip | 自定义域名 | 主机名 |
---|---|---|
192.168.3.8 | master.k8s.io | k8s-vip |
192.168.3.10 | master01.k8s.io | k8s-master-01 |
192.168.3.5 | master02.k8s.io | k8s-master-02 |
192.168.3.12 | master03.k8s.io | k8s-master-03 |
192.168.3.6 | node01.k8s.io | k8s-node-01 |
192.168.3.2 | node02.k8s.io | k8s-node-02 |
192.168.3.4 | node03.k8s.io | k8s-node-03 |
elastic-oparator搭建完成eck, kibana管理界面汉化和建立新用户权限设置。
初始化环境参考https://duiniwukenaihe.github.io/2019/10/21/k8s-efk/。然后默认把7.4的镜像修改成7.5.0直接升级了一下
cat <<EOF | kubectl apply -f -
apiVersion: kibana.k8s.elastic.co/v1beta1
kind: Kibana
metadata:
name: kibana
namespace: elastic-system
spec:
version: 7.5.0
count: 1
elasticsearchRef:
name: "elastic"
http:
tls:
selfSignedCertificate:
disabled: true
podTemplate:
spec:
containers:
- name: kibana
env:
- name: I18N_LOCALE
value: zh-CN
resources:
requests:
memory: 1Gi
limits:
memory: 2Gi
volumeMounts:
- name: timezone-volume
mountPath: /etc/localtime
readOnly: true
volumes:
- name: timezone-volume
hostPath:
path: /usr/share/zoneinfo/Asia/Shanghai
EOF
这样就可以支持中文了
按照官方教程 创建后貌似用户是无法登陆的,New user can’t login kibana。可参考https://discuss.elastic.co/t/new-user-cant-login-kibana/204810。
cat <<EOF | kubectl apply -f -
apiVersion: elasticsearch.k8s.elastic.co/v1beta1
kind: Elasticsearch
metadata:
name: elastic
namespace: elastic-system
spec:
version: 7.5.0
nodeSets:
- name: elastic
count: 3
config:
node.master: true
node.data: true
node.ingest: true
node.store.allow_mmap: false
xpack.security.authc.realms:
native:
native1:
order: 1
volumeClaimTemplates:
- metadata:
name: elasticsearch-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 30Gi
storageClassName: rook-ceph-block
EOF
增加了:
xpack.security.authc.realms:
native:
native1:
order: 1
其他参考官方文档即可。
集群配置: 初始集群环境kubeadm 1.16.3
ip | 自定义域名 | 主机名 |
---|---|---|
192.168.3.8 | master.k8s.io | k8s-vip |
192.168.3.10 | master01.k8s.io | k8s-master-01 |
192.168.3.5 | master02.k8s.io | k8s-master-02 |
192.168.3.12 | master03.k8s.io | k8s-master-03 |
192.168.3.6 | node01.k8s.io | k8s-node-01 |
192.168.3.2 | node02.k8s.io | k8s-node-02 |
192.168.3.4 | node03.k8s.io | k8s-node-03 |
示例过程参考http://www.mydlq.club/article/11/超级小豆丁文档进行操作,版本过程略有不同。初衷是没有进过大公司,羡慕大公司的工作流,安装下sonarqube与jenkins集成跑个测试用例自己安慰下自己…… 上一张抄来的流程图
点击 配置—SCM—Disable the SCM Sensor 将其关闭
2. 安装 分析插件
点击配置-应用市场,搜索安装了java php js的相关插件,还安装了L10n,开始没有安装,pipeline后面编译maven示例的时候报错了,安装还是有必要的
token 字符串是用于 Jenkins 在执行流水线时候将待检测信息发送到 SonarQube的安全凭证。 点击右上角头像—我的账号—安全—生成令牌 生成验证的 Token。
Maven Integration plugin
Pipeline Maven Integration Plugin
Pipeline Utility Steps
SonarQube Scanner for Jenkins
打开 系统管理—插件管理—可选插件 输入 相关插件名称 进行插件筛选,直接安装就Ok了。
2. 连接sonarqube
点击凭据-系统-全局凭证-添加凭据-Secret text,复制sonarqube token到Secret ID,命名为sonar了 我就. 系统管理-系统配置-SonarQube servers,添加sonarqube service配置。name 随便命名了一个jenkins,server url,由于我的jenkins和sonarqube 在一个namespace 我直接用了service 那么 通信,server authentication 添加了上一步创建的 sonar的secret text。
3. 配置 SonarQube Scanner 插件
打开 系统管理—全局工具配置—SonarQube Scanner 输入 Name,选择最新版本点击自动安装即可.
4. 配置 maven插件
打开 系统管理—全局工具配置—Maven 输入 Name,选择最新版本点击自动安装即可.(我的安装的时候一直下不下来包,就直接下载了一个最新版的包copy到了容器中的路径中去.)
创建pipeline流水线测试项目
1. 创建流水线任务
2. 参数化构建流程-文本参数
名称: sonar_project_properties 默认值: sonar.sources=src sonar.language=java sonar.sourceEncoding=UTF-8 sonar.java.binaries=target/classes sonar.java.source=1.8 sonar.java.target=1.8
3. 创建pipeline 脚本 这里都是直接copy过来的
**// 设置超时时间为10分钟,如果未成功则结束任务 timeout(time: 600, unit: 'SECONDS') { node () { stage('Git 拉取阶段'){ // Git 拉取代码 git branch: "master" ,changelog: true , url: "https://github.com/a324670547/springboot-helloworld" } stage('Maven 编译阶段') { // 设置 Maven 工具,引用先前全局工具配置中设置工具的名称 def m3 = tool name: 'maven' // 执行 Maven 命令 sh "${m3}/bin/mvn -B -e clean install -Dmaven.test.skip=true" } stage('SonarQube 扫描阶段'){ // 读取maven变量 pom = readMavenPom file: "./pom.xml" // 创建SonarQube配置文件 writeFile file: 'sonar-project.properties', text: """sonar.projectKey=${pom.artifactId}:${pom.version}\n"""+ """sonar.projectName=${pom.artifactId}\n"""+ """sonar.projectVersion=${pom.version}\n"""+ """${sonar_project_properties}""" // 设置 SonarQube 代码扫描工具,引用先前全局工具配置中设置工具的名称 def sonarqubeScanner = tool name: 'sonar-scanner' // 设置 SonarQube 环境,其中参数设置为之前系统设置中SonarQuke服务器配置的 Name withSonarQubeEnv('jenkins') { // 执行代码扫描 sh "${sonarqubeScanner}/bin/sonar-scanner" } } } }**
4. 执行jenkins任务构建
点击 Build with Parameters 执行 Jenkins 任务,由于插件安装不完整,sonarqube 少安装了L10n插件,开始失败率 好多次。等待确认成功
登陆sonarqube查看扫描结果.
总结:流程算是草草完成,还有很多不明白的地方,因为工作环境都是php,也没有成熟的发布流程,对java的maven构建还是很陌生。而且sonarqube的配置还是十分不熟悉。后续先搞明白下sonarqube的各种配置设置参数,系统的看下maven gradle这些主流的java构建工具。
集群配置: 初始集群环境kubeadm 1.16.3
ip | 自定义域名 | 主机名 |
---|---|---|
192.168.3.8 | master.k8s.io | k8s-vip |
192.168.3.10 | master01.k8s.io | k8s-master-01 |
192.168.3.5 | master02.k8s.io | k8s-master-02 |
192.168.3.12 | master03.k8s.io | k8s-master-03 |
192.168.3.6 | node01.k8s.io | k8s-node-01 |
192.168.3.2 | node02.k8s.io | k8s-node-02 |
192.168.3.4 | node03.k8s.io | k8s-node-03 |
正常来说helm玩的好应该是直接安装的但是玩的不太好 ,postgresql 和sonarqube分成两部安装的。变量各种用的不熟悉,安装后sonarqube报错什么的, 就分成两步安装了。
git clone https://github.com/helm/charts
cd charts/stable/sonarqube/postgresql
修改 values.yaml,就设置了用户密码和存储类storageClass。
postgresqlPassword: qmVy5wubfmcekZy3
storageClass: "rook-ceph-block"
helm install --name sonar-postgresql -f values.yaml . --namespace kube-ops
进入postgresql 创建sonar数据库
export POSTGRES_PASSWORD=$(kubectl get secret --namespace kube-ops sonar-postgresql -o jsonpath="{.data.postgresql-password}" | base64 --decode)
kubectl run sonar-postgresql-client --rm --tty -i --restart='Never' --namespace kube-ops --image docker.io/bitnami/postgresql:11.6.0-debian-9-r0 --env="PGPASSWORD=$POSTGRES_PASSWORD" --command -- psql --host sonar-postgresql -U postgres -d postgres -p 5432
postgres=# CREATE DATABASE sonar;
kubectl delete pods sonar-postgresql-client -n kube-ops 客户端就删除了就是看helm安装的输出试了一下呢。
cd ../sonarqube
rm -rf requirements.yaml
# 不删除的话还要检查依赖charts目录下放postgresql的 chart目录。放上试了几次没有整明白,就分开整了
修改values.yaml
#配置storageclass
storageClass: rook-ceph-block
accessMode: ReadWriteOnce
size: 10Gi
#配置postgresql
postgresql:
# Enable to deploy the PostgreSQL chart
enabled: false
# To use an external PostgreSQL instance, set enabled to false and uncomment
# the line below:
postgresServer: "sonar-postgresql"
# To use an external secret for the password for an external PostgreSQL
# instance, set enabled to false and provide the name of the secret on the
# line below:
# postgresPasswordSecret: ""
postgresUser: "postgres"
postgresPassword: "qmVy5wubfmcekZy3"
postgresDatabase: "sonar"
# Specify the TCP port that PostgreSQL should use
service:
port: 5432
helm install –name sonar -f values.yaml . –namespace kube-ops
kubectl get pods -n kube-ops
kubectl get svc -n kube-ops
cat <<EOF > sonarqube-https.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
namespace: kube-ops
name: sonar-sonarqube-https
spec:
entryPoints:
- websecure
tls:
secretName: all-saynaihe-com
routes:
- match: Host(\`sonarqube.sainaihe.com\`)
kind: Rule
services:
- name: sonar-sonarqube
port: 9000
EOF
kubectl apply -f sonarqube-https.yaml
ok安装完成了,有时间整下和jenkins的结合跑个例子。
集群配置: centos7.6
ip | 自定义域名 | 主机名 |
---|---|---|
192.168.3.9 | master.k8s.io | k8s-vip |
192.168.3.10 | master01.k8s.io | k8s-master-01 |
192.168.3.5 | master02.k8s.io | k8s-master-02 |
192.168.3.12 | master03.k8s.io | k8s-master-03 |
192.168.3.6 | node01.k8s.io | k8s-node-01 |
192.168.3.2 | node02.k8s.io | k8s-node-02 |
192.168.3.4 | node03.k8s.io | k8s-node-03 |
前面192.168.20.13这几台机器是用kubeadm1.15 搭建过 kubernetes的,后续出现了很多问题。开始的规划很不完善,后面就重新搭建了记录下:首先说下原来的不满意的地方:
- etcd自建外部挂载,个人对etcd不是很懂,版本升级兼容问题各种解决毕竟费劲,更主要的是都上容器了,我为什么不把etcd教给容器呢?当然了存储还是挂载master主机目录的。
- 腾讯云的slb了 还使用了haproxy,开始使用应用型负载均衡代理,后而且后面出现了各种诡异的问题,比如证书之类的。个人觉得问题应该简单化。
注:https://zhangguanzhang.github.io/2019/11/24/kubeadm-base-use/很多可以参考下馆长写的文章比较详细。
默认主机名已经与集群配置中对应,hostnamectl set-hostname设置过主机名
1. 关闭swap
swapoff -a sed -i 's/.*swap.*/#&/' /etc/fstab
2. 关闭selinux
setenforce 0 sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/sysconfig/selinux sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config sed -i "s/^SELINUX=permissive/SELINUX=disabled/g" /etc/sysconfig/selinux sed -i "s/^SELINUX=permissive/SELINUX=disabled/g" /etc/selinux/config ```bash #### 3. 调整文件打开数等配置 ```bash echo "* soft nofile 65536" >> /etc/security/limits.conf echo "* hard nofile 65536" >> /etc/security/limits.conf echo "* soft nproc 65536" >> /etc/security/limits.conf echo "* hard nproc 65536" >> /etc/security/limits.conf echo "* soft memlock unlimited" >> /etc/security/limits.conf echo "* hard memlock unlimited" >> /etc/security/limits.conf
4. 开启ip转发
cat <<EOF > /etc/sysctl.d/k8s.conf net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1 net.ipv4.neigh.default.gc_stale_time = 120 net.ipv4.conf.all.rp_filter = 0 net.ipv4.conf.default.rp_filter = 0 net.ipv4.conf.default.arp_announce = 2 net.ipv4.conf.lo.arp_announce = 2 net.ipv4.conf.all.arp_announce = 2 net.ipv4.ip_forward = 1 net.ipv4.tcp_max_tw_buckets = 5000 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 1024 net.ipv4.tcp_synack_retries = 2 net.ipv4.tcp_keepalive_time = 600 net.ipv4.tcp_keepalive_intvl = 30 net.ipv4.tcp_keepalive_probes = 10 # 要求iptables不对bridge的数据进行处理 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-arptables = 1 net.netfilter.nf_conntrack_max = 2310720 fs.inotify.max_user_watches=89100 fs.may_detach_mounts = 1 fs.file-max = 52706963 fs.nr_open = 52706963 vm.overcommit_memory=1 vm.panic_on_oom=0 vm.swappiness = 0 EOF modprobe br_netfilter sysctl -p /etc/sysctl.d/k8s.conf sysctl -p /etc/sysctl.d/k8s.conf
vim /etc/sysconfig/modules/ipvs.modules
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
yum install ipset
sed -ri 's/^\$ModLoad imjournal/#&/' /etc/rsyslog.conf
sed -ri 's/^\$IMJournalStateFile/#&/' /etc/rsyslog.conf
sed -ri 's/^#(DefaultLimitCORE)=/\1=100000/' /etc/systemd/system.conf
sed -ri 's/^#(DefaultLimitNOFILE)=/\1=100000/' /etc/systemd/system.conf
sed -ri 's/^#(UseDNS )yes/\1no/' /etc/ssh/sshd_config
journalctl --vacuum-size=20M
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
安装依赖包
yum install -y epel-release
yum install -y yum-utils device-mapper-persistent-data lvm2 net-tools conntrack-tools wget vim ntpdate libseccomp libtool-ltdl
安装bash命令提示
yum install -y bash-argsparse bash-completion bash-#completion-extras
安装docker kubeadm:
yum install docker-ce -y
#配置镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://lrpol8ec.mirror.aliyuncs.com"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
添加个日志最多值,否则有的苦了,入坑体验过了。docker要不要开机启动呢?我后面安装rook ceph 开机重新启动了老有错误,因为没有将节点设置为cordon,但是也懒了, 我就没有设置为开机启动。故开机启动后在启动docker了
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable kubelet
yum install -y haproxy
cat <<EOF > /etc/haproxy/haproxy.cfg
#---------------------------------------------------------------------
# Example configuration for a possible web application. See the
# full configuration options online.
#
# http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
#
#---------------------------------------------------------------------
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
# to have these messages end up in /var/log/haproxy.log you will
# need to:
#
# 1) configure syslog to accept network log events. This is done
# by adding the '-r' option to the SYSLOGD_OPTIONS in
# /etc/sysconfig/syslog
#
# 2) configure local2 events to go to the /var/log/haproxy.log
# file. A line like the following can be added to
# /etc/sysconfig/syslog
#
# local2.* /var/log/haproxy.log
#
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode tcp
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend kubernetes
bind *:8443 #配置端口为8443
mode tcp
default_backend kubernetes-master
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
backend kubernetes-master #后端服务器,也就是说访问192.168.255.140:8443会将请求转发到后端的三台,这样就实现了负载均衡
balance roundrobin
server master1 192.168.3.10:6443 check maxconn 2000
server master2 192.168.3.5:6443 check maxconn 2000
server master3 192.168.3.12:6443 check maxconn 2000
EOF
systemctl enable haproxy && systemctl start haproxy && systemctl status haproxy
腾讯云slb负载均衡最终还是用了传统型,监听器tcp 6443代理后端三台haproxy 8443端口
master1节点
cat <<EOF > kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.16.2
apiServer:
certSANs:
- k8s-master-01
- k8s-master-02
- k8s-master-03
- k8s-master-04
- master.k8s.io
- 192.168.3.10
- 192.168.3.5
- 192.168.3.12
- 192.168.3.9
- 192.168.3.3
- 127.0.0.1
controlPlaneEndpoint: "192.168.3.9:6443"
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
networking:
podSubnet: 10.30.0.0/16
serviceSubnet: 10.31.0.0/16
EOF
kubectl apply -f kubeadm-config.yaml
现在最新的是1.16.3,安装的时候是1.16.2就用了默认配置文件了。网络规划不会弄,这样貌似有点很差劲,因为以后想弄联邦集群,后面再想解决方法吧。另外腾讯云曾经开源过一个tencentcloud-cloud-controller-manager,其实很多可以打通的,但是试用了下 坑多的样子没有跑通,放弃了
kubeadm init --config initconfig.yaml
mkdir -p $HOME/.kube
sudo \cp /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
按照输出master02 ,master03节点加入集群
kubeadm join 192.168.3.9:6443 --token jiprvz.0rkovt1gx3d658j --discovery-token-ca-cert-hash sha256:5d631bb4bdce033163037ef21f663c88e058e70c6c362c9c5ccb1a92095 --control-plane --certificate-key 0eaa7e5f8efbdc8d381fb329c28c49f87af284fecc0c9443501e81f3cdc4
将master01 /etc/kubernetes/pki目录下ca* sa* fr* etcd 打包分发到master02,master03 /etc/kubernetes/pki目录下
注: key都胡乱输入的这里没有用自己的,复制pki这部忘了 老的版本都复制来,记得这个版本我没有复制key的?可以安装流程自己看看
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
修改配置文件中Network 为自己设置的子网,我这里是10.30.0.0/16
kubectl apply -f kube-flannel.yml
然后基本发现 master节点都已经redeay
kubeadm join 192.168.3.9:6443 --token 3o6dy0.9gbbfuf55xiloe9d --discovery-token-ca-cert-hash sha256:5d631bb4bdce01dcad51163037ef21f663c88e058e70c6c362c9c5ccb1a92095
OK集群算是初始搭建完了,不知道跑一遍咋样,我的是正常跑起来了。
kubectl edit cm kube-proxy -n kube-system
configmap/kube-proxy edited
#修改如下
kind: MasterConfiguration
apiVersion: kubeadm.k8s.io/v1alpha1
...
ipvs:
excludeCIDRs: null
minSyncPeriod: 0s
scheduler: ""
syncPeriod: 30s
kind: KubeProxyConfiguration
metricsBindAddress: 127.0.0.1:10249
mode: "ipvs" #修改
kubectl get pod -n kube-system | grep kube-proxy |awk '{system("kubectl delete pod "$1" -n kube-system")}'
貌似应该就跑起来了,然后后面应该还要做的:
- etcd的备份,虽然有三个master节点 数据无价,还是做下etcd的备份要好。
- pods 可能都running了 但是最后还是看下日志,肯能有些小的失误,看日志是个好习惯的,老版本糊里糊涂搭建的时候kubernetes插件pod打了一大堆日志 虽然可以使用,但是还是要追求下完美的。由此可见搭建日志采集系统还是很有必要的。
- work节点最好打上标签,不是服务设置亲和性和反亲和性。资源的调度使用值貌似可以设置的?否则后面有的work会出现pods一直创建中,打标签合理规划资源还是很有必要的。