生产环境 centos7
nfs服务器 centos7
管理服务器 ubuntu18.04
总的流程:安装k3s容器编排系统,使用docker安装rancher os,将k3s交给rancher管理(web可视化),再用rancher部署其他应用
安装K3S
选择k3s 而不是k8s:轻量,使用
container
而不是完全体的docker,加入SQLite
原生支持,使用traefik
原生支持k8s网络的负载均衡
代替旧的nginx-ingress
服务和客户节点相同操作:
如果你的服务器在国外或者有翻墙代理代理,那么直接运行下面的命令:
wget -O k3s https://get.k3s.io && chmod +x k3s && ./k3s --no-deploy traefik
-
1.使用代理下载好
k3s
和airgap
镜像ps:下面是我放在国内公有云存储的镜像,可能不是最新的,这样md5校验会出错
wget https://k3s-images.oss-cn-qingdao.aliyuncs.com/k3s wget https://k3s-images.oss-cn-qingdao.aliyuncs.com/k3s-airgap-images-amd64.tar
-
2.赋予k3s可执行权限
chmod +x k3s
-
3.将
airgap
添加到k3s(airgap
是k3s的容器系统
)mkdir -p /var/lib/rancher/k3s/agent/images/ cp k3s-airgap-images-amd64.tar /var/lib/rancher/k3s/agent/images/
-
4.安装k3s不带traefik(还有bug,暂时用
nginx-ingress
)./k3s --no-deploy traefik
-
5.验证是否成功
kubectl get node
!如果无返回或返回错误,请设置
hostname
,k8s网络根据本机hostname的值确定name
,如果hostname是原始的localhost
值会报错
docker 安装和配置
new:
- 0.0 snap 安装docker
19.09.08 update: 推荐使用
snap
包管理器,这是一个新的支持多种linux发行版的包管理器,利用了虚拟空间,所以解决了软件api的问题,让linux在软件安装方面变得像windows一样统一和方便~~~/手动滑稽
- 0.1 ubuntu18.04之后自带snap 你可以使用如下命令直接安装docker :
snap install docker
- 0.2 centos平台:
如果没有添加epel仓库,首先安装它
然后安装snapdyum install epel-release
使socket生效yum install snapd
添加软连接systemctl enable --now snapd.socket
安装dockerln -s /var/lib/snapd/snap /snap
snap install docker
old:
- 1.1 ubuntu:
- 1.1.2 安装以支持https存储库传输
apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
- 1.1.3 安装公钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
- 1.1.4 添加仓库源并更新源
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" && apt update
- 1.1.5 安装docker
apt install docker-ce docker-ce-cli containerd.io
- 1.1.2 安装以支持https存储库传输
- 1.2 centos
- 1.2.1 安装https支持
yum install -y yum-utils device-mapper-persistent-data lvm2
- 1.2.2 添加仓库
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- 1.2.3 安装docker
yum install docker-ce docker-ce-cli containerd.io
- 1.2.1 安装https支持
- 2.添加镜像加速源,这里我们用了阿里云容器镜像加速器:
rancher部署
Rancher 是 用来管理
kubernetes
集群的web端 官方DOC
-
1.拉取并运行
rancher
docker run -d --restart=unless-stopped -p 8443:443 --name rancher -v /data/rancher/:/var/lib/rancher rancher/rancher
打开
https://yourmaster_ip:18443
重置密码,登陆;注意!这里需要将IP替换成内网
的ip(内部集群可访问的master_ip地址,当然如果你需要添加其他公网地址的集群,那么就使用默认的) -
2.部署k3s集群
- 点击
添加集群
-
导入现有的kubernetes集群
,创建 -
node
节点执行最后一条命令
稍微等待几分钟,状态变为
Acitve
部署完成 - 点击
-
3.应用商店添加
helm
国内源
名称 | 商店url | 分支 | 作用范围 |
---|---|---|---|
helm | mirror.azure.cn/kubernetes/… | master | global |
incubator | mirror.azure.cn/kubernetes/… | master | global |
-
4.rancher的持久化配置
-
4.1 nfs持久化 nfs主机配置持久化目录
/data
,开启nfs服务端yum -y install rpcbind nfs-utils mkdir /data -p
配置挂载目录,设置相应权限,这里加
insecure
是为了允许1024以上的端口echo "/data *(insecure,rw,no_root_squash,sync)" >> /etc/exports
重载配置文件,重启nfs服务
exportfs -r systemctl start rpcbind nfs-server systemctl enable rpcbind nfs-server
使用
showmount -e localhost
验证nfs服务端挂载情况:Export list for 192.168.6.39: /data *
-
4.2示例: rancher中持久化流程
①所在集群中添加一个PV(持久卷);NFS插件(如果你没有配置nfs,也可以用别的方式,比如local node path/disk),访问模式多主机读写,下同
②Default:添加
pvc
,使用现有的PV③Default:
工作负载
中部署服务
,数据卷
选择现有PVC
总结:一个持久化的应用,必须有pv卷和pvc存储
网络优化NGINX-INGRESS
system项目中在应用商店安装NGINX-INGRESS
使用方法:非system项目中,
①工作负载的端口映射中网络模式选择集群IP
②添加对应应用的负载均衡
,如果使用泛域名解析到管理节点ip,如在域名服务商dns解析你有 *.app.cloud.cn >> rancher_ip 这样的解析
假设有工作负载(应用)nginx,你可以添加这样的ingress负载均衡,域名nginx.app.cloud.cn
,工作负载nginx
,容器端口80
则访问 nginx.app.cloud.cn 会负载均衡到nginx服务上,同理你可以访问 wordpress.app.cloud.cn 解析到 wordpress 服务上
nginx-ingress
使单ip节点的集群可以运行不同的web服务而不会有端口冲突的问题,你甚至可以在同一集群上部署多个nginx,而这些“相同”的nginx却可以”互相独立“的服务,这一点类似于BGP网络,即使一个服务gg了,但如果备份的服务还在运行,那么流量将会导入这个备份的服务,这样避免了单节点故障,使服务能长久地运行,而且服务升级时可以新老并行,这样可以给用户足够过渡到新服务地时间
部署gitlab社区版
-
1.添加名称
pv-gitlab
(自定义)持久化存储PV,挂载点/data/pvgitlab
,访问模式多主机读写(使用nfs方式) -
2.添加gitlab的PVC,名称
pvc-gitlab
,使用刚创建的PV -
3.添加gitlab-ce工作负载(应用):
-
3.1 你可以直接导入一份制作好的
YAML
文件进行部署 -
3.2 如果使用UI操作,请务必保证下列条件:
① 开放容器的80、22端口,映射到自定义的端口 ② 数据卷的挂载: /var/log/gitlab logs /var/opt/gitlab data /etc/gitlab config
其中
/data/pvgitlab/config/
下的gitlab.rb
这个文件为gitlab配置文件
-
-
4.宿主机内修改gitlab配置:
vim /data/gitlab/config/gitlab.rb
添加:
external_url 'http://yourgitlab_ip:port' nginx['listen_port'] = 80 nginx['listen_https'] = false gitlab_rails['gitlab_shell_ssh_port'] = 32222
这里有个两个小坑,nginx默认监听
external_url
的ip:port,所以我们需要重定义
下nginx实际监听端口。gitlab_shell_ssh_port
仅仅改变了ssh clone地址的前端
,而实际的gitlab ssh 还在监听22端口,可以在gitlab容器中使用cat /var/log/gitlab/sshd/current
验证这一点,所以你不能在rancher - gitlab 工作负载中把容器的22端口改为 32222,否则会被直接拒绝或者无法验证部署在gitlab上ssh公钥
集成jenkins
- 1.添加工作负载
- 2.获取登录密码:jenkins 工作负载,右侧三个点点击它,在这里你可以针对单个负载
执行命令行
,使用cat /var/jenkins_home/secrets/initialAdminPassword
获取相应密钥 - 3.换源:
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
- 4.安装
gitlab
、ssh
、gitlab hook
、authen
插件
集成runner
gitlab-runner 的负载均衡执行命令行
注册一个runner
gitlab-runner register
按照提示依次填入http://your_gitlab_ip/admin/runners
给出的url和token,其他根据个人需求填写,执行环境选择kubernetes
集成openldap
waiting。。。。
gitlab集成k3s网络(现在还有bug,gitlab需要独立于rancher才能安装helm,暂时不推荐~)
在gitlab 中添加kubernetes集群,我们需要补全信息
在Rancher Web中集群
这里可以使用kubectl
命令行和k3s交互
!注:新版本gitlab 默认禁止本地网络的webhook,所以我们要在Admin->settting->network->Outbound requests 中 勾选Allow requests to the local network from web hooks and services 或者添加本地ip白名单
-
1.URL
https://localhost:6443
将ip替换为node节点的ip -
2.获取CA 先获取证书的name
kubectl get secrets
再解码,将下面的
name
替换成返回得到的namekubectl get secret name -o jsonpath="{['data']['ca\.crt']}" | base64 --decode
-
3.获取服务令牌(toke)
- 3.1创建一个服务账户并赋予它集群管理员角色
cat <<EOF | kubectl apply -f - apiVersion: v1 kind: ServiceAccount metadata: name: gitlab-admin namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: gitlab-admin roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: gitlab-admin namespace: kube-system EOF
- 3.2检索密钥资源
SECRET=$(kubectl -n kube-system get secret | grep gitlab-admin | awk '{print $1}')
- 3.3提取token
TOKEN=$(kubectl -n kube-system get secret $SECRET -o jsonpath='{.data.token}' | base64 --decode)
echo $TOKEN
- 3.1创建一个服务账户并赋予它集群管理员角色