前言
工作中越来越重度使用k8s,想进一步了解k8s的工作原理。一方面学习业界优秀系统设计思路,另一方面多了解也可以提高日常工作效率,比如和k8s开发的沟通效率等。今天第一步:自己着手搭建一个k8s服务。
本文采用的版本:
kubectl kubelet kubeadm版本: 1.23.1
操作系统版本: CentOS 8.2 64位
准备工作
1.采购云主机
官方建议最低云主机配置2核4G,国内任意云厂商采购就行,作为K8S服务的宿主机。本教程操作系统为CentOS 8.2 64位。
备注:官方文档标记最低配置内存要求2G,但是安装完dashboard、ingress等服务之后比较卡顿,所以为了流畅这里推荐4G内存。
2.放开端口
外网放开30000
端口,后续浏览器登陆k8s dashboard看板使用。并检查ssh服务端口22是否正常开启。
使用ssh登陆云主机,开始配置。
3.安装工具
安装常用工具:
yum install -y yum-utils device-mapper-persistent-data lvm2 iproute-tc
4.添加阿里源
国内存在墙的问题,添加阿里源加速:
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
开始安装
1.安装社区版本docker
安装:
yum -y install docker-ce
enable:
systemctl enable docker
查看docker版本docker version
:
2.安装 kubectl kubelet kubeadm
2.1添加阿里源
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
注意点:v1.24版本后kubernetes放弃docker,安装过程存在一些问题,这里我们指定1.23.1版本安装。
2.2安装 1.23.1版本 kubectl kubelet kubeadm:
yum install -y kubectl-1.23.1 kubelet-1.23.1 kubeadm-1.23.1
启动kubelet:
systemctl enable kubelet
查看kubectl版本:
2.3修改cgroupdriver
执行如下命令:
cat <<EOF > //www.evlit.com/etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"] } EOF
重启服务:
systemctl daemon-reload systemctl restart docker systemctl restart kubelet
2.4替换镜像源
由于这里我们使用的是国内的云厂商,访问海外k8s.gcr.io
拉取镜像存在墙的问题,所以下面我们就替换成registry.cn-hangzhou.aliyuncs.com/google_containers
的地址,具体操作如下:
删除旧配置文件:
rm -f /etc/containerd/config.toml
生产默认配置文件:
containerd config default > /etc/containerd/config.toml
替换镜像地址:
sed -i 's/k8s.gcr.io/registry.cn-hangzhou.aliyuncs.com\/google_containers/' /etc/containerd/config.toml
重启containerd
:
systemctl restart containerd
2.4初始化k8s master节点
初始化命令:
kubeadm init --kubernetes-version=1.23.1 \ --apiserver-advertise-address=<你的云主机内网IP> \ --image-repository registry.aliyuncs.com/google_containers \ --service-cidr=10.10.0.0/16 --pod-network-cidr=10.122.0.0/16
通常会卡在这一步,如果大家按照本文的版本,理论不会报错,如果报错需要逐个搜索解决了。
如果初始化失败,执行如下命令后再重新初始化:
kubeadm reset -f
初始化成功之后得到如下命令,加入新的node节点使用(本次不使用):
kubeadm join <你的云主机内网IP>:6443 --token 78376v.rznvls130w3sgwb7 \ --discovery-token-ca-cert-hash sha256:add03fb7de52ad73fd96626fa9d9f0d639186524ba34d24742c15fce8093b8c5
配置kubectl
:
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
查看k8s服务启动状态:
kubectl get pod --all-namespaces
3.安装calico网络
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
安装完毕后,查看calico服务启动状态:
kubectl get pod --all-namespaces
4.安装kubernates-dashboard
4.1 下载配置文件
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc7/aio/deploy/recommended.yaml
4.2 添加nodeport
配置nodeport,外网访问dashboard:
4.3 创建dashboard服务
创建:
kubectl apply -f recommended.yaml
查看kubernetes-dashboard启动状态:
kubectl get pod -n kubernetes-dashboard
4.4 外网访问dashboard
浏览器打开dashboard,地址:你的外网IP:30000
如上图所示,因为https的问题,浏览器会提示「您的连接不是私密连接」。推荐使用chrome浏览器,并在当前页面上任意位置点击,然后键盘输入「thisisunsafe」再点击回车健即可。
4.5 获取token
创建用户。dashboard-adminuser.yaml
配置文件示例,执行如下命令直接创建,参考官方教程创建示例用户 https://github.com/kubernetes/dashboard/blob/master/docs/user/access-control/creating-sample-user.md
:
创建配置文件:
cat <<EOF > dashboard-adminuser.yaml apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kubernetes-dashboard --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: admin-user roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: admin-user namespace: kubernetes-dashboard EOF
创建用户:
kubectl apply -f dashboard-adminuser.yaml
创建成功之后提示:
serviceaccount/admin-user created clusterrolebinding.rbac.authorization.k8s.io/admin-user created
执行如下命令获取token:
kubectl
-n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard
get sa/admin-user -o jsonpath="{.secrets[0].name}") -o
go-template="{{.data.token | base64decode}}"
4.6 复制token登陆dashboard
到这里我们已经可以正常创建pod了,但是外网还不能直接访问到pod,虽然可以采用dashboard的nodeport
的方案,但是nodeport
只支持暴露30000-32767的端口,不适用于生产环境,接着我们就通过另一种方式ingress
来对外暴露pod。
5. 安装ingress
ingress-nginx详细官方教程:https://kubernetes.github.io/ingress-nginx/deploy/#quick-start
5.1 下载官方配置文件,这里使用的v1.3.1版本:
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.3.1/deploy/static/provider/cloud/deploy.yaml
5.2 同样由于墙的问题,我们把配置文件中的镜像源换成阿里源:
替换nginx-ingress-controller
镜像源:
sed
-i
's/registry.k8s.io\/ingress-nginx\/controller:v1.3.1@sha256:54f7fe2c6c5a9db9a0ebf1131797109bb7a4d91f56b9b362bde2abd237dd1974/registry.cn-hangzhou.aliyuncs.com\/google_containers\/nginx-ingress-controller:v1.3.1/g'
./deploy.yaml
替换kube-webhook-certgen
镜像源:
sed
-i
's/registry.k8s.io\/ingress-nginx\/kube-webhook-certgen:v1.3.0@sha256:549e71a6ca248c5abd51cdb73dbc3083df62cf92ed5e6147c780e30f7e007a47/registry.cn-hangzhou.aliyuncs.com\/google_containers\/kube-webhook-certgen:v1.3.0/g'
./deploy.yaml
5.3 创建ingress服务
创建:
kubectl apply -f deploy.yaml
查看状态:
kubectl get pod --all-namespaces
创建完成之后,查看ingress状态,为pending
状态,原因是缺少LB,这里我们使用metallb
。
5.4 安装metallb
执行安装命令:
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.7/config/manifests/metallb-native.yaml
创建secret:
kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"
查看安装状态:
kubectl get ns kubectl get all -n metallb-system
5.4 绑定外网IP EXTERNAL-IP
kubectl get service ingress-nginx-controller --namespace=ingress-nginx
kubectl edit service ingress-nginx-controller --namespace=ingress-nginx
添加:
externalIPs:
– 118.195.228.232
kubectl get service ingress-nginx-controller --namespace=ingress-nginx
查看启动状态kubectl get pod --all-namespaces
:
metalab和ingress-nginx
的状态还是pending
,查看原因:
kubectl describe pod ingress-nginx-controller-6bfbdbdd64-jp7lw -n ingress-nginx
原因是现在只有master
节点,还没有node
节点,未了节省成本,这里我们允许master参与调度,把master节点也当node使用。
5.5 允许master节点可以被调度
执行:
kubectl taint nodes --all node-role.kubernetes.io/master-
查看pod状态:
kubectl get pod --all-namespaces
pod均正常运行。到这里,一个基础的k8s服务基本安装完成。
体验k8s
解析域名
你的测试域名A解析到服务器的外网IP上,具体步骤略。
创建测试服务pod
你创建一个部署空间,使用httpd作为一个服务:
kubectl create deployment demo --image=httpd --port=80
kubectl expose deployment demo
创建ingress映射
kubectl create ingress demo --class=nginx --rule="k8s.tigerb.cn/*=demo:80"
测试
查看ingress服务service的外网端口
demo
pod启动成功后访问http://k8s.tigerb.cn:32374/
测试服务即可。
到此为止,我们就成功部署了一个k8s服务,使用dashborad就可以很轻松完成服务部署、扩容、缩容等。
本文来自微信公众号: TIGERB
您也可以联系文章作者本人进行修改,若内容侵权或非法,可以联系我们进行处理。
任何个人或组织,转载、发布本站文章到任何网站、书籍等各类媒体平台,必须在文末署名文章出处并链接到本站相应文章的URL地址。
本站文章如转载自其他网站,会在文末署名原文出处及原文URL的跳转链接,如有遗漏,烦请告知修正。
如若本站文章侵犯了原著者的合法权益,亦可联系我们进行处理。
hi5个月前0
请问有详细一点的自己搭建的教程吗你好6个月前0
你好,可以再帮我看看吗? 我已经按照你的方法设定了,还是一样,wordpress后台的 Purge Varnish Cache 插件还是清除不到cache,依旧显示 the varnish control terminal is not responding at。谢谢https://mjj.today/i/Srk2Tz https://mjj.today/i/Srkcoi你好6个月前0
对,你说的没错,我配置的时候改了一些东西,现在我按照你的教学,可以启动了,网页可以缓存了,不过wordpress 清除cache 那个插件没用的,我输入本地回环地址127.0.0.1 :6082 ,再输入API key ,插件显示the varnish control terminal is not responding at 127.0.0.1:6082,就你图片那样,然后试一下点击清除cache 那里,他显示error,研究了一天,还是没有不行。你好6个月前1
你好,为啥我按照你的方法,到第三部分,去到真正后源的服务器设定Varnish 部分,我填了真正后源的IP跟端口跟域名,然后重启 Varnish ,就出现这样了? 这是怎么回事? 谢谢[Linux] AMH 7.1 https://amh.sh[varnish-6.6 start] ================================================== =========== [OK] varnish-6.6 is already installed. Could not delete 'vcl_boot.1713549650.959259/vgc.sym': No such file or directory Error: Message from VCC-compiler: VCL version declaration missing Update your VCL to Version 4 syntax, and add vcl 4.1; on the first line of the VCL files. ('/home/usrdata/varnish/default.conf' Line 1 Pos 1) ...#---Running VCC-compiler failed, exited with 2 VCL compilation failedchu6个月前0
很完善的教程‘hu6个月前0
我用gmail EMAIL_SERVER="smtp://********@gmail.com:bpyfv*********chry@smtp.gmail.com:587"叽喳6个月前0
MAIL_SERVER="smtp://no-reply@vort.me:password123@wednesday.mxrouting.net:587"大佬 这个使用outlook 或者gmail 是什么样子的格式? 邮寄已经开启smtp了hu6个月前0
输入框的问题解决了,我没有设置反代,NEXTAUTH_URL改为域名+端口就好了