当前位置: 首页 > news >正文

盘古建网站企业文化设计

盘古建网站,企业文化设计,武汉站哪家设计公司,b2c网站策划方案KubeadmContainerdkeepalived部署高可用k8s(v1.28.2)集群 一.环境准备,二.容器运行时Containerd安装请参照前文。KubeadmContainerd部署k8s(v1.28.2)集群(非高可用版)-CSDN博客 文章目录 KubeadmContainerdkeepalived部署高可用k8s(v1.28.2)集…

Kubeadm+Containerd+keepalived部署高可用k8s(v1.28.2)集群

一.环境准备,二.容器运行时Containerd安装请参照前文。Kubeadm+Containerd部署k8s(v1.28.2)集群(非高可用版)-CSDN博客

文章目录

  • Kubeadm+Containerd+keepalived部署高可用k8s(v1.28.2)集群
      • 一.环境准备,二.容器运行时Containerd安装请参照前文。[Kubeadm+Containerd部署k8s(v1.28.2)集群(非高可用版)-CSDN博客](https://blog.csdn.net/qq_43479188/article/details/144567672)
      • 服务器准备
      • 三.安装`Keepalived`+`Nginx`配置`k8s apiserver`高可用
        • 1.安装`Keepalived`
        • 2.安装`Nginx`
        • 3.安装`msmtp`邮箱
        • 4.修改`Nginx`配置
        • 5.`keepalived`配置
        • 6.测试`Keepalived`是否配置成功
      • 四.K8S集群部署
        • 1.集群软件的apt源准备
        • 2.K8S集群软件的安装
        • 3.进行`kubectl`命令补全
        • 4.K8S集群初始化
        • 5.K8S集群网络插件Calico部署
        • 6.`Msater`节点设置Worker角色
      • 五.部署应用测试集群是否安装成功

服务器准备

服务器信息(此处为同一内网上的服务器,各个运营商的云服务器Keepalived功能是收费的)如本地搭建的服务器则需要保证在同一内网中,且最好关闭防火墙。

systemctl disable ufw
角色主机名称IPKubernetes版本
masterk8s-master1192.168.6.132v1.28.2
master2k8s-master2192.168.6.131v1.28.2
VIP192.168.6.139

三.安装Keepalived+Nginx配置k8s apiserver高可用

1.安装Keepalived

在两个master节点分别执行

apt update
#安装keepalived
apt install -y keepalived
2.安装Nginx

因为默认的Ubuntu源安装的Nginx,是简版,不包括--with-stream等模块,所以这里选择安装Nginx官方源的版本

#更新源
apt-get update
#下载必须组件
apt-get install -y gnupg2 curl lsb-release ca-certificates
#添加密钥
curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo tee /etc/apt/trusted.gpg.d/nginx.asc
#添加镜像源地址
sh -c "echo 'deb http://nginx.org/packages/mainline/ubuntu/ $(lsb_release -cs) nginx' > /etc/apt/sources.list.d/nginx.list"
#再次更新镜像源
apt-get update
#下载安装Nginx
apt-get install nginx

检测Nginx是否安装成功,可以看到有我们需要的模块。

nginx -V

image-20241223151306032

3.安装msmtp邮箱
#执行命令安装邮箱功能
apt install  -y msmtp msmtp-mta ca-certificates bsd-mailx
#编辑配置文件
vi ~/.msmtprc
# QQ SMTP 服务器设置
account default
host smtp.qq.com
port 465
auth on
user your_email@qq.com
password your_password(授权码)
from your_email@qq.com
tls on
tls_starttls off
tls_certcheck off
logfile ~/.msmtp.log
#测试是否能够发送邮件
echo "Test email body" | msmtp -a default recipient@example.com
4.修改Nginx配置

修改Nginx配置,两个节点相同:

#这一步避免修改配置后重启包报错
mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.back
#修改配置文件
cat > /etc/nginx/nginx.conf << -'EOF'user  nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;include /etc/nginx/conf.d/*.conf;events {worker_connections 1024;
}# 四层负载均衡,为两台Master apiserver组件提供负载均衡
stream {log_format  main  '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';access_log  /var/log/nginx/k8s-access.log  main;upstream k8s-apiserver {server 192.168.6.131:6443;   # xianchaomaster2 APISERVER IP:PORTserver 192.168.6.132:6443;   # xianchaomaster3 APISERVER IP:PORT}server {listen 16443; # 由于nginx与master节点复用,这个监听端口不能是6443,否则会冲突proxy_pass k8s-apiserver;}
}http {log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  /var/log/nginx/access.log  main;sendfile            on;tcp_nopush          on;tcp_nodelay         on;keepalive_timeout   65;types_hash_max_size 2048;include             /etc/nginx/mime.types;default_type        application/octet-stream;server {listen       80 default_server;server_name  _;location / {}}
}-EOF
5.keepalived配置
  • keepalived配置:
cat > /etc/keepalived/keepalived.conf << -'EOF'
global_defs {notification_email { #指定keepalived在发生事件时(比如切换)发送通知邮件的邮箱,2*****0@qq.com  #设置报警邮件地址,可以设置多个,每行一个。 需开启本机的sendmail服务}notification_email_from 1*****05@qq.com  #keepalived在发生诸如切换操作时需要发送email通知地址smtp_server smtp.qq.com   #指定发送email的smtp服务器smtp_connect_timeout 30 #设置连接smtp server的超时时间router_id NGINX_MASTER  #运行keepalived的机器的一个标识,通常可设为hostname。故障发生时,发邮件时显示在邮件主题中的信息。
}vrrp_script chk_nginx {script "/etc/keepalived/nginx_check.sh"interval 2   #脚本执行间隔,每2s检测一次timeout 2weight -5   #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5rise 2      #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)fall 2      #检测2次成功就算成功。但不修改优先级}
vrrp_instance VI_1 {state MASTERinterface ens34 #换成自己服务器的网卡名ifconfig查看virtual_router_id 51priority 100  #MASTER的优先级必须大于BACKUP的优先级,slave设置的值不能超过weight设置倍数,非常重要advert_int 1  #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒authentication {auth_type PASSauth_pass 20210825}virtual_ipaddress {192.168.6.139/32  dev ens34 label ens34:1}notify_master "/etc/keepalived/mail_notify.sh master" #当前节点成为主节点时触发的脚本notify_backup "/etc/keepalived/mail_notify.sh backup" #当前节点转为备节点时触发的脚本notify_fault "/etc/keepalived/mail_notify.sh  fault"  #当前节点转为失败状态时触发的脚本track_script {                         chk_nginx}
}-EOF

注意此处#后面的注释为解释用,修改的时候请删除##后面的内容。

  • 配置脚本(两个节点都需要)
#新增Nginx检查脚本
cat > /etc/keepalived/check_nginx.sh  << -'EOF'
#!/bin/bash
if [ "${nginx_pid}" = "0" ]; thensystemctl start nginxsleep 2nginx_pidd=$(ps -C nginx --no-heading|wc -l)if [ "${nginx_pidd}" = "0" ]; thensystemctl stop keepalivedsystemctl stop nginxfi
fi-EOF#给脚本赋权
chmod +x  /etc/keepalived/check_nginx.sh
#新增主节点keepalived漂移后告警脚mail_notify.sh
cat > /etc/keepalived/mail_notify.sh  << -'EOF'
#!/bin/bash
IPADDR=$(/usr/sbin/ifconfig eth0 | grep "inet" | awk '{ print $2}')
contact='2*****80@qq.com'function notify() {mailsubject="nginx服务器${IPADDR},keepalived-master $1 状态被激活,查看nginx服务运行状态"mailbody="$(date +'%F %T'): 服务器${IPADDR} keepalived vip发生漂移, 当前服务器keepalived状态为 $1,节点为msater"echo "$mailbody" | mail -s "$mailsubject" $contact
}case $1 inmaster)notify master;;backup)notify backup;;fault)notify fault;;*)echo "Usage: $(basename$0) {master|backup|fault}"exit 100;;
esac-EOF#给脚本赋权
chmod +x  /etc/keepalived/mail_notify.sh
#新增备节点keepalived漂移后告警脚mail_notify.sh
cat > /etc/keepalived/mail_notify.sh  << -'EOF'
#!/bin/bashIPADDR=$(/usr/sbin/ifconfig eth0 | grep "inet" | awk '{ print $2}')
contact='2*****80@qq.com'function notify() {mailsubject="nginx服务器${IPADDR},keepalived-backup 状态被激活,查看nginx服务运行状态"mailbody="$(date +'%F %T'): 服务器${IPADDR} keepalived vip发生漂移, 当前服务器keepalived状态为 $1,节点为Backup"echo "$mailbody" | mail -s "$mailsubject" $contact
}case $1 inmaster)notify master;;backup)notify backup;;fault)notify fault;;*)echo "Usage: $(basename$0) {master|backup|fault}"exit 100;;
esac-EOF#给脚本赋权
chmod +x  /etc/keepalived/mail_notify.sh
  • Keepalived配置
cat > /etc/keepalived/keepalived.conf << -'EOF'
global_defs {notification_email {2*****80@qq.com}notification_email_from 19*****05@qq.comsmtp_server smtp.qq.comsmtp_connect_timeout 30router_id NGINX_SLAVE
}vrrp_script chk_nginx {script "/etc/keepalived/check_nginx.sh"interval 2timeout 2weight -5rise 2fall 2}
vrrp_instance VI_1 {state BACKUP #此处需修改为BACKUPinterface ens34virtual_router_id 51priority 95 #注意此处设置的值不能比msater节点高advert_int 1authentication {auth_type PASSauth_pass 20210825}virtual_ipaddress {192.168.6.139/32  dev ens34 label ens34:1}notify_master "/etc/keepalived/mail_notify.sh master"notify_backup "/etc/keepalived/mail_notify.sh backup"notify_fault "/etc/keepalived/mail_notify.sh  fault"track_script {chk_nginx}
}-EOF

注意此处#后面的注释为解释用,修改的时候请删除##后面的内容。

  • 启动服务(两个节点都执行)
systemctl daemon-reload
systemctl restart nginx
systemctl start keepalived
systemctl enable nginx keepalived
6.测试Keepalived是否配置成功
  • 主节点检查是否绑定VIP
ip addr show | grep ens34

image-20241223155621018

  • 备节点检查是否绑定VIP

image-20241223155726242

可以看到此时的VIP已经绑定到主节点,现在测试主备节点和其他处于统一网络环境的内网服务器是否能够Ping通这个VIP节点。

主节点:image-20241223155905258

备节点:image-20241223155919410

其他内网服务器:image-20241223160002474

如果都测试通过则代表VIP地址是可用的。

  • 测试VIP是否能够漂移
#停止keepalived服务
systemctl stop keepalived.service

可以看到停止之后就收到了邮件,然后可以在backup节点看到,VIP已经漂移过去了。

image-20241223181059272

image-20241223170703011

然后我们在master节点启动keepalived

systemctl start keepalived.service

可以看到VIP已经漂移回msater

image-20241223182307892

image-20241223182429327

同时会收到三个邮件。

至此k8s apiserver高可用就配置完成。

四.K8S集群部署

1.集群软件的apt源准备

此处使用使用阿里云镜像源:

#添加镜像源
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
#添加密钥
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
#更新源
apt-get update
2.K8S集群软件的安装

查看可以安装的软件列表

apt-cache madison kubeadm

image-20241218184305800

可以看到最新的版本是1.28.2,此处选择安装的版本是1.28.2,可自行选择。

apt-get install -y kubelet=1.28.2-00 kubeadm=1.28.2-00 kubectl=1.28.2-00

node节点上可以不用安装kubectl

apt-get install -y kubelet=1.28.2-00 kubeadm=1.28.2-00

启动kueblet,并设置开机自启动。

systemctl enable --now kubelet

为求稳定,通过以下命令进行锁定定版本。

apt-mark hold kubelet kubeadm kubectl 
3.进行kubectl命令补全
#安装命令补全工具
apt install bash-completion
kubectl completion bash > /etc/bash_completion.d/kubectlls /etc/bash_completion.d/kubectl
source /etc/bash_completion.d/kubectl
source ~/.bashrc
4.K8S集群初始化
#创建文件夹
mkdir -p /home/k8s/init/
#生成默认配置文件
kubeadm config print init-defaults > /home/k8s/init/kubeadm-init.yaml

image-20241218184654259

修改文件的一些参数:

apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:- system:bootstrappers:kubeadm:default-node-tokentoken: abcdef.0123456789abcdefttl: 24h0m0susages:- signing- authentication
kind: InitConfiguration
localAPIEndpoint:advertiseAddress: 192.168.6.139 #此处配置VIP地址bindPort: 6443 #端口地址不变,因为Nginx配置的还是6443
nodeRegistration:criSocket: unix:///var/run/containerd/containerd.sockimagePullPolicy: IfNotPresentname: k8s-mastertaints: null
---
apiServer:certSANs: #此处配置VIP地址和其他两个主节点的地址- 192.168.6.131- 192.168.6.132- 192.168.6.139timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:local:dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.28.2
controlPlaneEndpoint: 192.168.6.139:16443 #此处配置VIP地址加Nginx代理后的端口
networking:dnsDomain: cluster.localserviceSubnet: 10.244.0.0/12podSubnet: 10.96.0.0/16
scheduler: {}

注意此处#后面的注释为解释用,修改的时候请删除##后面的内容。

通过以下命令列举出需要拉取的镜像:

kubeadm config images list --config  /home/k8s/init/kubeadm-init.yaml

image-20241218185014902

通过下面命令进行拉取:

kubeadm config images pull --config  /home/k8s/init/kubeadm-init.yaml

然后通过以下命令进行初始化:

kubeadm init --config=/home/k8s/init/kubeadm-init.yaml --upload-certs --v=6

可以看到此处和非高可用版有点不一样:

--v=6 是日志级别参数,表示将日志详细度设置为 6(范围是 0 到 10,数字越高日志越详细)。

--upload-certs 参数用于将集群的控制平面节点所需的证书上传到 kubeadm 的配置存储(存储在 etcd 中),以便其他控制平面节点(通过 kubeadm join 命令)可以拉取这些证书并加入集群。

在配置高可用的 Kubernetes 集群(即包含多个控制平面节点)的时候,需要使用 --upload-certs。没有这个参数,后续添加控制平面节点时需要手动提供证书。

出现如下信息则证明初始化成功:

image-20241223183722233

然后按照上述的提示,进行如下的操作:

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

执行完上述的命令,就可以通过kubectl进行查看k8s集群的状态信息。如下图:

image-20241223183818105

因为一开始没有安装Calico等网络插件,所以节点状态是STATUS: NotReady

新节msater点加入到集群中,复制输出中的包含--control-plane的命令:

kubeadm join 192.168.6.139:16443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:8f7971ee2f7a2baefbcde6ca28afb77107df09a96caa2a8e39fed876574a40a2 \--control-plane --certificate-key a5607ce95a056f7a9510830860706c35174f46195f31009c98a67b28b833243a

在另一个msater节点执行。子节点则是下面的:

kubeadm join 192.168.6.139:16443 --token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:8f7971ee2f7a2baefbcde6ca28afb77107df09a96caa2a8e39fed876574a40a2

执行后如图:
image-20241223184028976

然后按照上述的提示,进行如下的操作:

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

再次查看节点:

image-20241223184204241

同样是STATUS: NotReady

在安装途中可以通过如下命令来排查节点插件的安装进程:

kubectl get pod -n kube-system -o wide | grep k8s-master2

image-20241218190226229

image-20241218190256750

如果一直未启动成功可以用如下命令来排查:

kubectl describe pod -n kube-system <PodID>
#或者
kubectl logs -f -n kube-system <PodID>

在节点上还可以通过crictl ps -a命令来排查是否有pod启动。同理,在初始化的时候也可以这样排查。

image-20241218190620121

crictlContainerd的命令行工具。

5.K8S集群网络插件Calico部署

​ 此处选用科学部署方式,拉取的镜像到自己的阿里云仓库。镜像地址如下:

registry.cn-hangzhou.aliyuncs.com/docker_image-ljx/calico-cni:v3.27.5
registry.cn-hangzhou.aliyuncs.com/docker_image-ljx/calico-node:v3.27.5
registry.cn-hangzhou.aliyuncs.com/docker_image-ljx/calico-kube-controllers:v3.27.5

分别替换name: upgrade-ipamname: install-cniname: "mount-bpffs"name: calico-nodename: calico-kube-controllers这几处的镜像地址,然后执行以下命令安装:

kubectl create -f calico.yml

calico文件地址如下calico/manifests/calico.yaml at release-v3.27 · projectcalico/calico

执行完上述的命令后,即可完成calico的部署。如下:

image-20241218191234111

可以看到每个节点都有Calico的插件,然后稍等一会,node节点就会变成Ready:

image-20241218191359047

6.Msater节点设置Worker角色

默认情况下Kubernetes Control Plane Master Node被设置为不能部署pod,因为Control Plane节点默认设置了以下NoSchedule标签:

如图:

kubectl describe node k8s-master | grep Taint

image-20241223184703561

所以去掉NoSchedule标签,即可在Control Plane调度Pod

#执行命令删除该节点的标签
kubectl taint node k8s-master2 node-role.kubernetes.io/control-plane:NoSchedule-

image-20241223184910432

#再次查看
kubectl describe node k8s-master2 | grep Taint

image-20241223184947223

可以发现标签已经删除。

五.部署应用测试集群是否安装成功

以部署一个Nginx应用为例,以下是一个简单的Nginx部署的yaml文件:

apiVersion: apps/v1     #与k8s集群版本有关,使用 kubectl api-versions 即可查看当前集群支持的版本
kind: Deployment        #该配置的类型,我们使用的是 Deployment
metadata:               #译名为元数据,即 Deployment 的一些基本属性和信息name: nginx-deployment        #Deployment 的名称labels:           #标签,可以灵活定位一个或多个资源,其中key和value均可自定义,可以定义多组,目前不需要理解app: nginx  #为该Deployment设置key为app,value为nginx的标签
spec:           #这是关于该Deployment的描述,可以理解为你期待该Deployment在k8s中如何使用replicas: 1   #使用该Deployment创建一个应用程序实例selector:         #标签选择器,与上面的标签共同作用,目前不需要理解matchLabels: #选择包含标签app:nginx的资源app: nginxtemplate:         #这是选择或创建的Pod的模板metadata:   #Pod的元数据labels:   #Pod的标签,上面的selector即选择包含标签app:nginx的Podapp: nginxspec:           #期望Pod实现的功能(即在pod中部署)containers:       #生成container,与docker中的container是同一种- name: nginx     #container的名称image: registry.cn-hangzhou.aliyuncs.com/docker_image-ljx/nginx:1.26.0  #使用镜像nginx:1.26.0创建container,该container默认80端口可访问
---
apiVersion: v1
kind: Service
metadata:name: nginx-service #Service 的名称labels:       #Service 自己的标签app: nginx  #为该 Service 设置 key 为 app,value 为 nginx 的标签
spec:     #这是关于该 Service 的定义,描述了 Service 如何选择 Pod,如何被访问selector:     #标签选择器app: nginx  #选择包含标签 app:nginx 的 Podports:- name: nginx-port  #端口的名字protocol: TCP     #协议类型 TCP/UDPport: 80          #集群内的其他容器组可通过 80 端口访问 ServicenodePort: 32600   #通过任意节点的 32600 端口访问 ServicetargetPort: 80  #将请求转发到匹配 Pod 的 80 端口type: NodePort  #Serive的类型,ClusterIP/NodePort/LoaderBalancer

上述的资源清单创建了两种类型一个Deployment,一个Service,然后执行命令部署:

kubectl apply -f nginx.yaml

执行成功后,如下图:

image-20241223185153003

可以看到这个pod是部署在那个删除标签的Control Plane节点的。

然后通过node节点IP+32600的方式进行访问:

image-20241218191914871


文章转载自:
http://wanjiaxiamen.rywn.cn
http://wanjiabrasilin.rywn.cn
http://wanjiaunmanageable.rywn.cn
http://wanjiamaunder.rywn.cn
http://wanjiaradiolocation.rywn.cn
http://wanjiaprotamin.rywn.cn
http://wanjiadawn.rywn.cn
http://wanjiaseminarian.rywn.cn
http://wanjiapressing.rywn.cn
http://wanjiaphotomontage.rywn.cn
http://wanjiapreprimer.rywn.cn
http://wanjiaumw.rywn.cn
http://wanjiadipropellant.rywn.cn
http://wanjiainternuclear.rywn.cn
http://wanjiamarrowless.rywn.cn
http://wanjiasorta.rywn.cn
http://wanjiabicentenary.rywn.cn
http://wanjiacerograph.rywn.cn
http://wanjiapomander.rywn.cn
http://wanjiaopenhearted.rywn.cn
http://wanjiarumormonger.rywn.cn
http://wanjiacommandeer.rywn.cn
http://wanjiafulgurite.rywn.cn
http://wanjiavivo.rywn.cn
http://wanjialiman.rywn.cn
http://wanjiacaptainless.rywn.cn
http://wanjiaphysician.rywn.cn
http://wanjiaventilator.rywn.cn
http://wanjiacircumjacent.rywn.cn
http://wanjiapolystichous.rywn.cn
http://wanjiahaikwan.rywn.cn
http://wanjiasplintage.rywn.cn
http://wanjianonillionth.rywn.cn
http://wanjiatilsiter.rywn.cn
http://wanjiarolling.rywn.cn
http://wanjiaghast.rywn.cn
http://wanjiamentality.rywn.cn
http://wanjiaholytide.rywn.cn
http://wanjiaflexual.rywn.cn
http://wanjiaslaveholder.rywn.cn
http://wanjiavibram.rywn.cn
http://wanjiadr.rywn.cn
http://wanjiaosmic.rywn.cn
http://wanjiastannous.rywn.cn
http://wanjiazilpah.rywn.cn
http://wanjiainflator.rywn.cn
http://wanjiaincongruent.rywn.cn
http://wanjiapathogenicity.rywn.cn
http://wanjiaclint.rywn.cn
http://wanjiaadvect.rywn.cn
http://wanjiatantamount.rywn.cn
http://wanjiacisco.rywn.cn
http://wanjiajcl.rywn.cn
http://wanjiaactinide.rywn.cn
http://wanjiafainthearted.rywn.cn
http://wanjiachait.rywn.cn
http://wanjiacanutism.rywn.cn
http://wanjiaarchaeological.rywn.cn
http://wanjialeaping.rywn.cn
http://wanjiaformer.rywn.cn
http://wanjiagangmaster.rywn.cn
http://wanjiadunlin.rywn.cn
http://wanjiaredeceive.rywn.cn
http://wanjiacampus.rywn.cn
http://wanjiawittingly.rywn.cn
http://wanjialwei.rywn.cn
http://wanjiaergotamine.rywn.cn
http://wanjianoninterference.rywn.cn
http://wanjiagorry.rywn.cn
http://wanjiademophil.rywn.cn
http://wanjiadoomsday.rywn.cn
http://wanjiaapproval.rywn.cn
http://wanjialobscouser.rywn.cn
http://wanjianumen.rywn.cn
http://wanjiamicroclimate.rywn.cn
http://wanjialadybird.rywn.cn
http://wanjiasymposia.rywn.cn
http://wanjiaserra.rywn.cn
http://wanjiaillyria.rywn.cn
http://wanjianitrite.rywn.cn
http://www.15wanjia.com/news/117282.html

相关文章:

  • 建设网站价钱cps广告联盟网站
  • 怎么把网站改为正在建设中百度推广助手下载
  • 建设一个电子文学网站资金多少优秀的网页设计案例
  • 宁波网站建设与设计金字塔百度下载链接
  • 国外最新十大新闻周口网站seo
  • 网上服装商城网站建设方案策划书sem推广是什么
  • 前后端分离的网站怎么做重庆网站推广
  • 专门做蛋糕面包的网站东莞seo优化公司
  • 网站建设ssc源码修复app推广方法及技巧
  • 那么多网站都是谁做的网站建设公司业务
  • 怎么能查到网站是哪个公司做的新的营销方式有哪些
  • 工业和信息化部发短信seo范畴有哪些
  • 帝国网站做地域标签百度手游app下载
  • 正规app开发和制作公司14个seo小技巧
  • 大学软件开发需要学什么seo优化外包顾问
  • 深圳直销网站开发互联网营销师证书怎么考多少钱
  • 在市政府门户网站建设南昌seo排名优化
  • 域名做好了怎么做网站内容广州seo服务外包
  • 彩妆网站建设策划书视频号广告推广
  • 黄埔区做网站产品全网营销推广
  • 有没有一个网站做黄油视频滁州网站seo
  • 淘宝上做网站不靠谱信息流广告代理商排名
  • 做优惠卷网站手游推广个人合作平台
  • 怎么在外管局的网站做延期金戈枸橼酸西地那非
  • 网站建设图片滑动代码怎么开发一款app软件
  • 泰国网站可以在中国做吗郑州关键词seo
  • 网站建设有哪些工作室推广平台下载
  • 软件开发培训机构价格重庆seo代理
  • 公司经营网站建设是一般纳税人要给别人开发票要缴什么税百度人工智能开放平台
  • 360网站免费推广怎么做seo教学平台