国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當前位置: 首頁 > news >正文

網站建設成本價瀏覽器看b站

網站建設成本價,瀏覽器看b站,深圳企業(yè)網站模板,新網站怎么做才能可以在百度上搜索到二 Kubernetes介紹 1.1 應用部署方式演變 在部署應用程序的方式上,主要經歷了三個時代: 傳統(tǒng)部署:互聯網早期,會直接將應用程序部署在物理機上 優(yōu)點:簡單,不需要其它技術的參與 缺點:不能為應…

二 Kubernetes介紹

1.1 應用部署方式演變

在部署應用程序的方式上,主要經歷了三個時代:

  • 傳統(tǒng)部署:互聯網早期,會直接將應用程序部署在物理機上

    優(yōu)點:簡單,不需要其它技術的參與

    缺點:不能為應用程序定義資源使用邊界,很難合理地分配計算資源,而且程序之間容易產生影響

  • 虛擬化部署:可以在一臺物理機上運行多個虛擬機,每個虛擬機都是獨立的一個環(huán)境

    優(yōu)點:程序環(huán)境不會相互產生影響,提供了一定程度的安全性

    缺點:增加了操作系統(tǒng),浪費了部分資源

  • 容器化部署:與虛擬化類似,但是共享了操作系統(tǒng)

    優(yōu)點:

    可以保證每個容器擁有自己的文件系統(tǒng)、CPU、內存、進程空間等

    運行應用程序所需要的資源都被容器包裝,并和底層基礎架構解耦

    容器化的應用程序可以跨云服務商、跨Linux操作系統(tǒng)發(fā)行版進行部署

在這里插入圖片描述

容器化部署方式給帶來很多的便利,但是也會出現一些問題,比如說:

  • 一個容器故障停機了,怎么樣讓另外一個容器立刻啟動去替補停機的容器
  • 當并發(fā)訪問量變大的時候,怎么樣做到橫向擴展容器數量

這些容器管理的問題統(tǒng)稱為容器編排問題,為了解決這些容器編排問題,就產生了一些容器編排的軟件:

  • Swarm:Docker自己的容器編排工具
  • Mesos:Apache的一個資源統(tǒng)一管控的工具,需要和Marathon結合使用
  • Kubernetes:Google開源的的容器編排工具

在這里插入圖片描述

1.2 kubernetes簡介

在這里插入圖片描述

kubernetes,是一個全新的基于容器技術的分布式架構領先方案,是谷歌嚴格保密十幾年的秘密武器----Borg系統(tǒng)的一個開源版本,于2014年9月發(fā)布第一個版本,2015年7月發(fā)布第一個正式版本。

kubernetes官網

kubernetes的本質是一組服務器集群,它可以在集群的每個節(jié)點上運行特定的程序,來對節(jié)點中的容器進行管理。目的是實現資源管理的自動化,主要提供了如下的主要功能:

  • 自我修復:一旦某一個容器崩潰,能夠在1秒中左右迅速啟動新的容器
  • 彈性伸縮:可以根據需要,自動對集群中正在運行的容器數量進行調整
  • 服務發(fā)現:服務可以通過自動發(fā)現的形式找到它所依賴的服務
  • 負載均衡:如果一個服務起動了多個容器,能夠自動實現請求的負載均衡
  • 版本回退:如果發(fā)現新發(fā)布的程序版本有問題,可以立即回退到原來的版本
  • 存儲編排:可以根據容器自身的需求自動創(chuàng)建存儲卷

在這里插入圖片描述

1.3 kubernetes組件

一個kubernetes集群主要是由控制節(jié)點(master,做管理)、工作節(jié)點(node) 構成,每個節(jié)點上都會安裝不同的組件。

master:集群的控制平面,負責集群的決策 ( 集群管理者 )

ApiServer : 資源操作的唯一入口,接收用戶輸入的命令,提供認證、授權、API注冊和發(fā)現等機制

Scheduler : 負責集群資源調度(計算),按照預定的調度策略將Pod調度到相應的node節(jié)點上

ControllerManager : 負責維護集群的狀態(tài),比如程序部署安排、故障檢測、自動擴展、滾動更新等

Etcd :負責存儲集群中各種資源對象的信息(默認使用etcd,也可以手動改為mysql等)

node:集群的數據平面,負責為容器提供運行環(huán)境 (真正干活 )

Kubelet : 負責維護容器的生命周期,即通過控制docker,來創(chuàng)建、更新、銷毀容器

KubeProxy : 負責提供集群內部的服務發(fā)現和負載均衡(訪問k8s里程序的入口,例如他可以提供訪問linux的入口)

Docker : 負責節(jié)點上容器的各種操作

在這里插入圖片描述

下面,以部署一個nginx服務來說明kubernetes系統(tǒng)各個組件調用關系:

  1. 首先要明確,一旦kubernetes環(huán)境啟動之后,master和node都會將自身的信息存儲到etcd數據庫中

  2. 一個nginx服務的安裝請求會首先被發(fā)送到master節(jié)點的apiServer組件

  3. apiServer組件會調用scheduler組件來決定到底應該把這個服務安裝到哪個node節(jié)點上

    在此時,它會從etcd中讀取各個node節(jié)點的信息,然后按照一定的算法進行選擇,并將結果告知apiServer

  4. apiServer調用controller-manager去調度Node節(jié)點安裝nginx服務

  5. kubelet接收到指令后,會通知docker,然后由docker來啟動一個nginx的pod

    pod是kubernetes的最小操作單元,容器必須跑在pod中

  6. 至此,一個nginx服務就運行了,如果需要訪問nginx,就需要通過kube-proxy來對pod產生訪問的代理

這樣,外界用戶就可以訪問集群中的nginx服務了

1.4 kubernetes概念

Master:集群控制節(jié)點,每個集群需要至少一個master節(jié)點負責集群的管控

Node:工作負載節(jié)點,由master分配容器到這些node工作節(jié)點上,然后node節(jié)點上的docker負責容器的運行

Pod:kubernetes的最小控制單元,容器都是運行在pod中的,一個pod中可以有1個或者多個容器

Controller:控制器,通過它來實現對pod的管理,比如啟動pod、停止pod、伸縮pod的數量等等

Service:pod對外服務的統(tǒng)一入口,下面可以維護者同一類的多個pod

Label:標簽,用于對pod進行分類,同一類pod會擁有相同的標簽

NameSpace:命名空間,用來隔離pod的運行環(huán)境(默認pod之間是可以相互訪問的,有了Namspace后,可以控制pod之間是否能訪問)

在這里插入圖片描述

二 kubernetes集群環(huán)境搭建

2.1 集群類型

Kubernetes集群大致分為兩類:一主多從和多主多從。
● 一主多從:一個Master節(jié)點和多臺Node節(jié)點,搭建簡單,但是有單機故障風險,適合用于測試環(huán)境。
● 多主多從:多臺Master和多臺Node節(jié)點,搭建麻煩,安全性高,適合用于生產環(huán)境。
在這里插入圖片描述

為了測試方便,本次搭建的是一主多從類型的集群。

2.1.1 安裝方式

kubernetes有多種部署方式,目前主流的方式有kubeadm、minikube、二進制包。

● minikube:一個用于快速搭建單節(jié)點的kubernetes工具。
● kubeadm:一個用于快速搭建kubernetes集群的工具。
● 二進制包:從官網上下載每個組件的二進制包,依次去安裝,此方式對于理解kubernetes組件更加有效。

我們需要安裝kubernetes的集群環(huán)境,但是又不想過于麻煩,所以選擇kubeadm方式

2.1.2 主機規(guī)劃

角色IP地址操作系統(tǒng)配置
Master192.168.18.100CentOS7.5,基礎設施服務器2核CPU,2G內存,50G硬盤
Node1192.168.18.101CentOS7.5,基礎設施服務器2核CPU,2G內存,50G硬盤
Node2192.168.18.102CentOS7.5,基礎設施服務器2核CPU,2G內存,50G硬盤

2.2 環(huán)境搭建

2.2.1 前言

本次環(huán)境搭建需要三臺CentOS服務器(一主二從),然后在每臺服務器中分別安裝Docker(18.06.3)、kubeadm(1.18.0)、kubectl(1.18.0)和kubelet(1.18.0)。

沒有特殊說明,就是三臺機器都需要執(zhí)行。

配置虛擬機IP與主機名

在這里插入圖片描述

配置ip
在這里插入圖片描述
在這里插入圖片描述
這里改為手動設置ip
在這里插入圖片描述
具體的ip網斷是多少?需要查一下這里:
在這里插入圖片描述
選擇net模式,左下角就是你自己虛擬機的網斷(注意,vmware默認.2是網關,所以ip不可以配成192.1681.109.2)
在這里插入圖片描述
所以回到ip配置這里繼續(xù)
在這里插入圖片描述

DNS地址使用阿里的地址即可

2.2.2 環(huán)境初始化

2.2.2.1 檢查操作系統(tǒng)的版本

檢查操作系統(tǒng)的版本(要求操作系統(tǒng)的版本至少在7.5以上)

cat /etc/redhat-release

在這里插入圖片描述

2.2.2.2 關閉防火墻和禁止防火墻開機啟動

生產環(huán)境不能這么干,只打開使用的端口即可

關閉防火墻:

systemctl stop firewalld

禁止防火墻開機啟動:

systemctl disable firewalld

在這里插入圖片描述

2.2.2.3 設置主機名

設置主機名語法

hostnamectl set-hostname <hostname>

設置192.168.18.100的主機名:

hostnamectl set-hostname master

設置192.168.18.101的主機名

hostnamectl set-hostname node1

設置192.168.18.102的主機名

hostnamectl set-hostname node2

2.2.2.4 主機名解析

為了方便后面集群節(jié)點間的直接調用,需要配置一下主機名解析,企業(yè)中推薦使用內部的DNS服務器里配置。

#vim /etc/hosts 
192.168.18.100 master
192.168.18.101 node1
192.168.18.102 node2

檢測配置是否成功:機器間直接ping主機名
在這里插入圖片描述

2.2.2.5 時間同步

kubernetes要求集群中的節(jié)點時間必須精確一致,所以在每個節(jié)點上添加時間同步(企業(yè)里建議配置自己的時間同步服務器):

直接執(zhí)行這倆命令:

systemctl start chronyd
systemctl enable chronyd

或者執(zhí)行下邊這倆命令也行:

yum install ntpdate -y
ntpdate time.windows.com

2.2.2.6 關閉selinux

selinux是linux下的安全服務,如果不關閉,在安裝集群中會產生各種問題

查看selinux是否開啟

getenforce

永久關閉selinux,需要重啟

#方式一
sed -i 's/enforcing/disabled/' /etc/selinux/config
#方式二:編輯/etc/selinux/config文件,修改SELINUX的值為disable
SELINUX=disable

臨時關閉selinux,重啟之后,無效:

# 臨時關閉
setenforce 0

2.2.2.7 關閉swap分區(qū)

在這里插入圖片描述

永久關閉swap分區(qū),需要重啟

sed -ri 's/.*swap.*/#&/' /etc/fstab

臨時關閉swap分區(qū),重啟之后,無效

swapoff -a

修改linux內核參數
在這里插入圖片描述

2.2.2.8 將橋接的IPv4流量傳遞到iptables的鏈

在每個節(jié)點上將橋接的IPv4流量傳遞到iptables的鏈

cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
# 加載br_netfilter模塊
modprobe br_netfilter
# 查看是否加載
lsmod | grep br_netfilter
# 生效
sysctl --system

2.2.2.9 開啟ipvs

● 在kubernetes中service有兩種代理模型,一種是基于iptables,另一種是基于ipvs的。ipvs的性能要高于iptables的,但是如果要使用它,需要手動載入ipvs模塊。
● 在每個節(jié)點安裝ipset和ipvsadm:

yum -y install ipset ipvsadm
# 	或者
yum install ipset ipvsadmin -y 

在所有節(jié)點執(zhí)行如下腳本:添加需要的模塊寫入腳本文件(直接復制下邊的命令回車即刻 )

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_ipv4
EOF

授權、運行、檢查是否加載:

chmod 755 /etc/sysconfig/modules/ipvs.modules 

執(zhí)行腳本

/bin/bash /etc/sysconfig/modules/ipvs.modules 

檢查是否加載:

lsmod | grep -e ipvs -e nf_conntrack_ipv4

2.2.2.10 重啟三臺機器

重啟三臺Linux機器:

reboot

2.2.3 每個節(jié)點安裝Docker、kubeadm、kubelet和kubectl

2.2.3.1 安裝Docker

  • 安裝docker
# 切換docker鏡像源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# 查看當前鏡像源中支持的docker鏡像
yum list docker-ce --showduplicates

在這里插入圖片描述

# 安裝docker
# --setopt=obsoletes=0:不寫這個參數,會自動安裝更高版本
yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y
# yum -y install docker-ce-18.06.3.ce-3.el7

在這里插入圖片描述

啟動docker

systemctl start docker
# 設置開機啟動docker
systemctl enable docker 

查看docker版本

docker version
  • 設置Docker鏡像加速器(上邊已經設置過了,這里不做也行)
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"exec-opts": ["native.cgroupdriver=systemd"],	"registry-mirrors": ["https://du3ia00u.mirror.aliyuncs.com"],	"live-restore": true,"log-driver":"json-file","log-opts": {"max-size":"500m", "max-file":"3"},"storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

2.2.3.2 添加阿里云的YUM軟件源

由于kubernetes的鏡像源在國外,非常慢,這里切換成國內的阿里云鏡像源:

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

或者vim /etc/yum.repos.d/kubernetes.repo,然后輸入如下內容

[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

2.2.3.3 安裝kubeadm、kubelet和kubectl

由于版本更新頻繁,這里指定版本號部署:

yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0

為了實現Docker使用的cgroup drvier和kubelet使用的cgroup drver一致,建議修改"/etc/sysconfig/kubelet"文件的內容:

vim /etc/sysconfig/kubelet
# 修改
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"

設置kubelet為開機自啟動即可,由于沒有生成配置文件,集群初始化后自動啟動:

systemctl enable kubelet

8完

2.2.4 查看k8s所需鏡像

查看k8s所需鏡像:

kubeadm config images list

在這里插入圖片描述
下載鏡像:這里下載1.17.4
在這里插入圖片描述
復制完上邊的命令后直接回車
在這里插入圖片描述
使用for循環(huán)下載上邊的鏡像(復制完直接回車)
在這里插入圖片描述
查看下載下來的鏡像
在這里插入圖片描述

2.2.5 部署k8s的Master節(jié)點

部署k8s的Master節(jié)點(192.168.18.100):

情況一:
上邊已經下載好了鏡像,可以直接使用下邊的命令初始化master即可
在這里插入圖片描述

情況二:
如果之前沒有下載好鏡像,可以使用下邊命令在線下載安裝master

# 由于默認拉取鏡像地址k8s.gcr.io國內無法訪問,這里需要指定阿里云鏡像倉庫地址
kubeadm init \--apiserver-advertise-address=192.168.18.100 \--image-repository registry.aliyuncs.com/google_containers \--kubernetes-version v1.18.0 \--service-cidr=10.96.0.0/12 \--pod-network-cidr=10.244.0.0/16

在這里插入圖片描述
在這里插入圖片描述
根據提示消息,在Master節(jié)點上使用kubectl工具:

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

2.2.6 部署k8s的Node節(jié)點

master安裝后,控制臺有如下命令:復制該命令到各個node節(jié)點去執(zhí)行,把node節(jié)點加入到master集群里
在這里插入圖片描述

根據提示,在192.168.18.101和192.168.18.102上添加如下的命令:

# 把當前node節(jié)點加入到集群里;注意,下邊的命令粘貼的是上邊master安裝后,控制臺打印出來的命令
kubeadm join 192.168.18.100:6443 --token jv039y.bh8yetcpo6zeqfyj \--discovery-token-ca-cert-hash sha256:3c81e535fd4f8ff1752617d7a2d56c3b23779cf9545e530828c0ff6b507e0e26

在這里插入圖片描述
查看集群里的節(jié)點信息
在這里插入圖片描述
可以看到,狀態(tài)是NotReady,即網絡還沒通,節(jié)點之間不能通信;

默認的token有效期為24小時,當過期之后,該token就不能用了,這時可以使用如下的命令創(chuàng)建token:

kubeadm token create --print-join-command
# 生成一個永不過期的token
kubeadm token create --ttl 0 --print-join-command

2.2.7 部署CNI網絡插件

根據提示,在Master節(jié)點上使用kubectl工具查看節(jié)點狀態(tài):

kubectl get nodes

在這里插入圖片描述
● kubernetes支持多種網絡插件,比如flannel、calico、canal等,任選一種即可,本次選擇flannel,如果網絡不行,可以使用本人提供的,當然,你也可以安裝calico
● 在Master節(jié)點上獲取flannel配置文件(可能會失敗,如果失敗,請下載到本地,然后安裝):

在這里插入圖片描述

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

下載下來后,修改文件里的倉庫為國內的倉庫地址
在這里插入圖片描述

使用配置文件啟動flannel:

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

查看部署CNI網絡插件進度:

kubectl get pods -n kube-system

在這里插入圖片描述
再次在Master節(jié)點使用kubectl工具查看節(jié)點狀態(tài)

kubectl get nodes

在這里插入圖片描述
查看集群健康狀況:

kubectl get cs

在這里插入圖片描述

kubectl cluster-info

在這里插入圖片描述

2.3 服務部署

2.3.1 前言

在Kubernetes集群中部署一個Nginx程序,測試下集群是否正常工作。

2.3.2 步驟

部署Nginx:(在master操作即可)

kubectl create deployment nginx --image=nginx:1.14-alpine

暴露端口:

# NodePort:集群外的瀏覽器可以訪問
kubectl expose deployment nginx --port=80 --type=NodePort

查看服務狀態(tài):

# svc:service
kubectl get pods,svc

在這里插入圖片描述
在這里插入圖片描述

2.4 kubernetes中kubectl命令自動補全

yum install -y bash-completion
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo “source <(kubectl completion bash)” >> ~/.bashrc
 vim /root/.bashrc 
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)

二 kubernetes集群環(huán)境搭建

2.1 前置知識點

目前生產部署Kubernetes 集群主要有兩種方式:

kubeadm

Kubeadm 是一個K8s 部署工具,提供kubeadm init 和kubeadm join,用于快速部署Kubernetes 集群。

官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

二進制包

從github 下載發(fā)行版的二進制包,手動部署每個組件,組成Kubernetes 集群。

Kubeadm 降低部署門檻,但屏蔽了很多細節(jié),遇到問題很難排查。如果想更容易可控,推薦使用二進制包部署Kubernetes 集群,雖然手動部署麻煩點,期間可以學習很多工作原理,也利于后期維護。

在這里插入圖片描述

2.2 kubeadm 部署方式介紹

kubeadm 是官方社區(qū)推出的一個用于快速部署kubernetes 集群的工具,這個工具能通過兩條指令完成一個kubernetes 集群的部署:

  • 創(chuàng)建一個Master 節(jié)點kubeadm init
  • 將Node 節(jié)點加入到當前集群中$ kubeadm join <Master 節(jié)點的IP 和端口>

2.3 安裝要求

在開始之前,部署Kubernetes 集群機器需要滿足以下幾個條件:

  • 一臺或多臺機器,操作系統(tǒng)CentOS7.x-86_x64
  • 硬件配置:2GB 或更多RAM,2 個CPU 或更多CPU,硬盤30GB 或更多
  • 集群中所有機器之間網絡互通
  • 可以訪問外網,需要拉取鏡像
  • 禁止swap 分區(qū)

2.4 最終目標

  • 在所有節(jié)點上安裝Docker 和kubeadm
  • 部署Kubernetes Master
  • 部署容器網絡插件
  • 部署Kubernetes Node,將節(jié)點加入Kubernetes 集群中
  • 部署Dashboard Web 頁面,可視化查看Kubernetes 資源

2.5 準備環(huán)境

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-tq1on6fU-1640144981804)(Kubenetes.assets/image-20210609000002940.png)]

角色IP地址組件
k8s-master01192.168.5.3docker,kubectl,kubeadm,kubelet
k8s-node01192.168.5.4docker,kubectl,kubeadm,kubelet
k8s-node02192.168.5.5docker,kubectl,kubeadm,kubelet

2.6 系統(tǒng)初始化

2.6.1 設置系統(tǒng)主機名以及 Host 文件的相互解析

hostnamectl set-hostname k8s-master01 && bash
hostnamectl set-hostname k8s-node01 && bash
hostnamectl set-hostname k8s-node02 && bash
cat <<EOF>> /etc/hosts
192.168.5.3     k8s-master01
192.168.5.4     k8s-node01
192.168.5.5     k8s-node02
EOF
scp /etc/hosts root@192.168.5.4:/etc/hosts 
scp /etc/hosts root@192.168.5.5:/etc/hosts 

2.6.2 安裝依賴文件(所有節(jié)點都要操作)

yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git

2.6.3 設置防火墻為 Iptables 并設置空規(guī)則(所有節(jié)點都要操作)

systemctl stop firewalld && systemctl disable firewalldyum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save

2.6.4 關閉 SELINUX(所有節(jié)點都要操作)

swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstabsetenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

2.6.5 調整內核參數,對于 K8S(所有節(jié)點都要操作)

modprobe br_netfiltercat <<EOF> kubernetes.conf 
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
vm.swappiness=0 # 禁止使用 swap 空間,只有當系統(tǒng) OOM 時才允許使用它
vm.overcommit_memory=1 # 不檢查物理內存是否夠用
vm.panic_on_oom=0 # 開啟 OOM
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
net.netfilter.nf_conntrack_max=2310720
EOFcp kubernetes.conf /etc/sysctl.d/kubernetes.confsysctl -p /etc/sysctl.d/kubernetes.conf

2.6.6 調整系統(tǒng)時區(qū)(所有節(jié)點都要操作)

# 設置系統(tǒng)時區(qū)為 中國/上海
timedatectl set-timezone Asia/Shanghai
# 將當前的 UTC 時間寫入硬件時鐘
timedatectl set-local-rtc 0
# 重啟依賴于系統(tǒng)時間的服務
systemctl restart rsyslog
systemctl restart crond

2.6.7 設置 rsyslogd 和 systemd journald(所有節(jié)點都要操作)

# 持久化保存日志的目錄
mkdir /var/log/journal 
mkdir /etc/systemd/journald.conf.d
cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
[Journal]
# 持久化保存到磁盤
Storage=persistent# 壓縮歷史日志
Compress=yesSyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000# 最大占用空間 10G
SystemMaxUse=10G# 單日志文件最大 200M
SystemMaxFileSize=200M# 日志保存時間 2 周
MaxRetentionSec=2week# 不將日志轉發(fā)到 syslog
ForwardToSyslog=no
EOFsystemctl restart systemd-journald

2.6.8 kube-proxy開啟ipvs的前置條件(所有節(jié)點都要操作)

cat <<EOF> /etc/sysconfig/modules/ipvs.modules 
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOFchmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

2.6.9 安裝 Docker 軟件(所有節(jié)點都要操作)

yum install -y yum-utils device-mapper-persistent-data lvm2yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoyum install -y docker-ce## 創(chuàng)建 /etc/docker 目錄
mkdir /etc/dockercat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
}
}
EOF
mkdir -p /etc/systemd/system/docker.service.d
# 重啟docker服務
systemctl daemon-reload && systemctl restart docker && systemctl enable docker

上傳文件到/etc/yum.repos.d/ 目錄下,也可以 代替 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 命令

docker-ce.repo

[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg[docker-ce-stable-debuginfo]
name=Docker CE Stable - Debuginfo $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/debug-$basearch/stable
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg[docker-ce-stable-source]
name=Docker CE Stable - Sources
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/source/stable
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg[docker-ce-test]
name=Docker CE Test - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/test
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg[docker-ce-test-debuginfo]
name=Docker CE Test - Debuginfo $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/debug-$basearch/test
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg[docker-ce-test-source]
name=Docker CE Test - Sources
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/source/test
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg[docker-ce-nightly]
name=Docker CE Nightly - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/nightly
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg[docker-ce-nightly-debuginfo]
name=Docker CE Nightly - Debuginfo $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/debug-$basearch/nightly
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg[docker-ce-nightly-source]
name=Docker CE Nightly - Sources
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/source/nightly
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

2.6.10 安裝 Kubeadm (所有節(jié)點都要操作)

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOFyum install -y kubelet kubeadm kubectl && systemctl enable kubelet

2.7 部署Kubernetes Master

2.7.1 初始化主節(jié)點(主節(jié)點操作)

kubeadm init --apiserver-advertise-address=192.168.5.3 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.21.1 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config

2.7.2 加入主節(jié)點以及其余工作節(jié)點

kubeadm join 192.168.5.3:6443 --token h0uelc.l46qp29nxscke7f7 \--discovery-token-ca-cert-hash sha256:abc807778e24bff73362ceeb783cc7f6feec96f20b4fd707c3f8e8312294e28f 

2.7.3 部署網絡

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

下邊是文件

---
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:name: psp.flannel.unprivilegedannotations:seccomp.security.alpha.kubernetes.io/allowedProfileNames: docker/defaultseccomp.security.alpha.kubernetes.io/defaultProfileName: docker/defaultapparmor.security.beta.kubernetes.io/allowedProfileNames: runtime/defaultapparmor.security.beta.kubernetes.io/defaultProfileName: runtime/default
spec:privileged: falsevolumes:- configMap- secret- emptyDir- hostPathallowedHostPaths:- pathPrefix: "/etc/cni/net.d"- pathPrefix: "/etc/kube-flannel"- pathPrefix: "/run/flannel"readOnlyRootFilesystem: false# Users and groupsrunAsUser:rule: RunAsAnysupplementalGroups:rule: RunAsAnyfsGroup:rule: RunAsAny# Privilege EscalationallowPrivilegeEscalation: falsedefaultAllowPrivilegeEscalation: false# CapabilitiesallowedCapabilities: ['NET_ADMIN', 'NET_RAW']defaultAddCapabilities: []requiredDropCapabilities: []# Host namespaceshostPID: falsehostIPC: falsehostNetwork: truehostPorts:- min: 0max: 65535# SELinuxseLinux:# SELinux is unused in CaaSPrule: 'RunAsAny'
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: flannel
rules:
- apiGroups: ['extensions']resources: ['podsecuritypolicies']verbs: ['use']resourceNames: ['psp.flannel.unprivileged']
- apiGroups:- ""resources:- podsverbs:- get
- apiGroups:- ""resources:- nodesverbs:- list- watch
- apiGroups:- ""resources:- nodes/statusverbs:- patch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: flannel
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: flannel
subjects:
- kind: ServiceAccountname: flannelnamespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:name: flannelnamespace: kube-system
---
kind: ConfigMap
apiVersion: v1
metadata:name: kube-flannel-cfgnamespace: kube-systemlabels:tier: nodeapp: flannel
data:cni-conf.json: |{"name": "cbr0","cniVersion": "0.3.1","plugins": [{"type": "flannel","delegate": {"hairpinMode": true,"isDefaultGateway": true}},{"type": "portmap","capabilities": {"portMappings": true}}]}net-conf.json: |{"Network": "10.244.0.0/16","Backend": {"Type": "vxlan"}}
---
apiVersion: apps/v1
kind: DaemonSet
metadata:name: kube-flannel-dsnamespace: kube-systemlabels:tier: nodeapp: flannel
spec:selector:matchLabels:app: flanneltemplate:metadata:labels:tier: nodeapp: flannelspec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/osoperator: Invalues:- linuxhostNetwork: truepriorityClassName: system-node-criticaltolerations:- operator: Existseffect: NoScheduleserviceAccountName: flannelinitContainers:- name: install-cniimage: quay.io/coreos/flannel:v0.14.0command:- cpargs:- -f- /etc/kube-flannel/cni-conf.json- /etc/cni/net.d/10-flannel.conflistvolumeMounts:- name: cnimountPath: /etc/cni/net.d- name: flannel-cfgmountPath: /etc/kube-flannel/containers:- name: kube-flannelimage: quay.io/coreos/flannel:v0.14.0command:- /opt/bin/flanneldargs:- --ip-masq- --kube-subnet-mgrresources:requests:cpu: "100m"memory: "50Mi"limits:cpu: "100m"memory: "50Mi"securityContext:privileged: falsecapabilities:add: ["NET_ADMIN", "NET_RAW"]env:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespacevolumeMounts:- name: runmountPath: /run/flannel- name: flannel-cfgmountPath: /etc/kube-flannel/volumes:- name: runhostPath:path: /run/flannel- name: cnihostPath:path: /etc/cni/net.d- name: flannel-cfgconfigMap:name: kube-flannel-cfg

2.8 測試kubernetes 集群

2.8.1 部署nginx 測試

kubectl create deployment nginx --image=nginxkubectl expose deployment nginx --port=80 --type=NodePortkubectl get pod,svc

三 資源管理

3.1 資源管理介紹

在kubernetes中,所有的內容都抽象為資源,用戶需要通過操作資源來管理kubernetes。

kubernetes的本質上就是一個集群系統(tǒng),用戶可以在集群中部署各種服務,所謂的部署服務,其實就是在kubernetes集群中運行一個個的容器,并將指定的程序跑在容器中。

kubernetes的最小管理單元是pod而不是容器,所以只能將容器放在Pod中,而kubernetes一般也不會直接管理Pod,而是通過Pod控制器來管理Pod的。

Pod可以提供服務之后,就要考慮如何訪問Pod中服務,kubernetes提供了Service資源實現這個功能。

當然,如果Pod中程序的數據需要持久化,kubernetes還提供了各種存儲系統(tǒng)。

在這里插入圖片描述

學習kubernetes的核心,就是學習如何對集群上的Pod、Pod控制器、Service、存儲等各種資源進行操作

3.2 YAML語言介紹

YAML是一個類似 XML、JSON 的標記性語言。它強調以數據為中心,并不是以標識語言為重點。因而YAML本身的定義比較簡單,號稱"一種人性化的數據格式語言"。

xml:

<heima><age>15</age><address>Beijing</address>
</heima>

yml:

heima:age: 15address: Beijing

YAML的語法比較簡單,主要有下面幾個:

  • 大小寫敏感
  • 使用縮進表示層級關系
  • 縮進不允許使用tab,只允許空格( 低版本限制 )
  • 縮進的空格數不重要,只要相同層級的元素左對齊即可
  • '#'表示注釋

YAML支持以下幾種數據類型:

  • 純量:單個的、不可再分的值
  • 對象:鍵值對的集合,又稱為映射(mapping)/ 哈希(hash) / 字典(dictionary)
  • 數組:一組按次序排列的值,又稱為序列(sequence) / 列表(list)
# 純量, 就是指的一個簡單的值,字符串、布爾值、整數、浮點數、Null、時間、日期
# 1 布爾類型
c1: true (或者True)
# 2 整型
c2: 234
# 3 浮點型
c3: 3.14
# 4 null類型 
c4: ~  # 使用~表示null
# 5 日期類型
c5: 2018-02-17    # 日期必須使用ISO 8601格式,即yyyy-MM-dd
# 6 時間類型
c6: 2018-02-17T15:02:31+08:00  # 時間使用ISO 8601格式,時間和日期之間使用T連接,最后使用+代表時區(qū)
# 7 字符串類型
c7: heima     # 簡單寫法,直接寫值 , 如果字符串中間有特殊字符,必須使用雙引號或者單引號包裹 
c8: line1line2     # 字符串過多的情況可以拆成多行,每一行會被轉化成一個空格
# 對象
# 形式一(推薦):
heima:age: 15address: Beijing
# 形式二(了解):
heima: {age: 15,address: Beijing}
# 數組
# 形式一(推薦):
address:- 順義- 昌平  
# 形式二(了解):
address: [順義,昌平]

小提示:

1 書寫yaml切記: 后面要加一個空格

2 如果需要將多段yaml配置放在一個文件中,中間要使用---分隔

3 下面是一個yaml轉json的網站,可以通過它驗證yaml是否書寫正確

https://www.json2yaml.com/convert-yaml-to-json

3.3 資源管理方式

下邊是三種創(chuàng)建pod的方式

  • 命令式對象管理:直接使用命令去操作kubernetes資源

    kubectl run nginx-pod --image=nginx:1.17.1 --port=80

  • 命令式對象配置:通過命令配置和配置文件去操作kubernetes資源

    kubectl create/patch -f nginx-pod.yaml

  • 聲明式對象配置:通過apply命令和配置文件去操作kubernetes資源
    apply:創(chuàng)建和更新資源(pod有的話就更新,沒有就創(chuàng)建)
    kubectl apply -f nginx-pod.yaml

類型操作對象適用環(huán)境優(yōu)點缺點
命令式對象管理對象測試簡單只能操作活動對象,無法審計、跟蹤
命令式對象配置文件開發(fā)可以審計、跟蹤項目大時,配置文件多,操作麻煩
聲明式對象配置目錄開發(fā)支持目錄操作意外情況下難以調試

3.3.1 命令式對象管理

kubectl命令

kubectl是kubernetes集群的命令行工具,通過它能夠對集群本身進行管理,并能夠在集群上進行容器化應用的安裝部署。kubectl命令的語法如下:

kubectl [command] [type] [name] [flags]

comand:指定要對資源執(zhí)行的操作,例如create、get、delete,可以通過kubectl --help命令查看所有命令

type:指定資源類型,比如deployment、pod、service

name:指定資源的名稱,名稱大小寫敏感

flags:指定額外的可選參數

# 查看所有pod
kubectl get pod # 查看某個pod
kubectl get pod pod_name# 查看某個pod,以yaml格式展示結果,yaml改為json就是以json格式顯示
kubectl get pod pod_name -o yaml

在這里插入圖片描述

操作(comand類型)

kubernetes允許對資源進行多種操作,可以通過–help查看詳細的操作命令

kubectl --help

經常使用的操作有下面這些:

命令分類命令翻譯命令作用
基本命令create創(chuàng)建創(chuàng)建一個資源
edit編輯編輯一個資源
get獲取獲取一個資源
patch更新更新一個資源
delete刪除刪除一個資源
explain解釋展示資源文檔
運行和調試run運行在集群中運行一個指定的鏡像
expose暴露暴露資源為Service
describe描述顯示資源內部信息
logs日志輸出容器在 pod 中的日志輸出容器在 pod 中的日志
attach纏繞進入運行中的容器進入運行中的容器
exec執(zhí)行容器中的一個命令執(zhí)行容器中的一個命令
cp復制在Pod內外復制文件
rollout首次展示管理資源的發(fā)布
scale規(guī)模擴(縮)容Pod的數量
autoscale自動調整自動調整Pod的數量
高級命令applyrc通過文件對資源進行配置
label標簽更新資源上的標簽
其他命令cluster-info集群信息顯示集群信息
version版本顯示當前Server和Client的版本

資源類型(type)

kubernetes中所有的內容都抽象為資源,可以通過下面的命令進行查看:

kubectl api-resources

經常使用的資源有下面這些:

資源分類資源名稱縮寫資源作用
集群級別資源nodesno集群組成部分
namespacesns隔離Pod
pod資源podspo裝載容器
pod資源控制器replicationcontrollersrc控制pod資源
replicasetsrs控制pod資源
deploymentsdeploy控制pod資源
daemonsetsds控制pod資源
jobs控制pod資源
cronjobscj控制pod資源
horizontalpodautoscalershpa控制pod資源
statefulsetssts控制pod資源
服務發(fā)現資源servicessvc統(tǒng)一pod對外接口
ingressing統(tǒng)一pod對外接口
存儲資源volumeattachments存儲
persistentvolumespv存儲
persistentvolumeclaimspvc存儲
配置資源configmapscm配置
secrets配置

下面以一個namespace / pod的創(chuàng)建和刪除簡單演示下命令的使用:

# 創(chuàng)建一個namespace  名稱叫dev  namespace可以簡寫為ns
[root@master ~]# kubectl create namespace dev
namespace/dev created# 獲取namespace
[root@master ~]# kubectl get ns  除了dev,其他是k8s集群自帶的
NAME              STATUS   AGE
default           Active   21h
dev               Active   21s
kube-node-lease   Active   21h
kube-public       Active   21h
kube-system       Active   21h# 在此namespace下創(chuàng)建并運行一個nginx的Pod
[root@master ~]# kubectl run pod --image=nginx:latest -n dev
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/pod created# 查看新創(chuàng)建的pod,默認查詢default的namespace下的pod
[root@master ~]# kubectl get pod -n dev
NAME  READY   STATUS    RESTARTS   AGE
pod   1/1     Running   0          21s# 刪除指定ns下的的指定pod
[root@master ~]# kubectl delete pods pod-864f9875b9-pcw7x -n dev
pod "pod" deleted# 刪除指定的namespace
[root@master ~]# kubectl delete ns dev
namespace "dev" deleted

3.3.2 命令式對象配置

命令式對象配置就是使用命令配合配置文件一起來操作kubernetes資源。

1) 創(chuàng)建一個nginxpod.yaml,內容如下:

#創(chuàng)建名字是dev的namespace
apiVersion: v1
kind: Namespace
metadata:name: dev#yml文件里,要寫兩個名字一樣的配置的話,需要使用---做分割
---#在dev下創(chuàng)建一個pod,pod名字是nginxpod,鏡像以及鏡像版本是nginx:1.17.1
apiVersion: v1
kind: Pod
metadata:name: nginxpodnamespace: dev
spec:containers:- name: nginx-containersimage: nginx:1.17.1

2)執(zhí)行create命令,創(chuàng)建資源:

[root@master ~]# kubectl create -f nginxpod.yaml
namespace/dev created
pod/nginxpod created

此時發(fā)現創(chuàng)建了兩個資源對象,分別是namespace和pod

查看名字是dev的namespace

kubectl get ns dev

查看dev下的pod

#pod可以寫成pods
kubectl get pod -n dev

在這里插入圖片描述

3)執(zhí)行get命令,查看資源:

[root@master ~]#  kubectl get -f nginxpod.yaml
NAME            STATUS   AGE
namespace/dev   Active   18sNAME            READY   STATUS    RESTARTS   AGE
pod/nginxpod    1/1     Running   0          17s

這樣就顯示了兩個資源對象的信息

4)執(zhí)行delete命令,刪除資源:

[root@master ~]# kubectl delete -f nginxpod.yaml
namespace "dev" deleted
pod "nginxpod" deleted

此時發(fā)現兩個資源對象被刪除了

總結:命令式對象配置的方式操作資源,可以簡單的認為:命令  +  yaml配置文件(里面是命令需要的各種參數)

3.3.3 聲明式對象配置

聲明式對象配置跟命令式對象配置很相似,但是它只有一個命令apply。

# 首先執(zhí)行一次kubectl apply -f yaml文件,發(fā)現創(chuàng)建了資源,此處使用的nginxpod.yaml文件還是上邊創(chuàng)建的那個文件
[root@master ~]#  kubectl apply -f nginxpod.yaml
namespace/dev created
pod/nginxpod created# 再次執(zhí)行一次kubectl apply -f yaml文件,發(fā)現說資源沒有變動
[root@master ~]#  kubectl apply -f nginxpod.yaml
namespace/dev unchanged
pod/nginxpod unchanged
總結:其實聲明式對象配置就是使用apply描述一個資源最終的狀態(tài)(在yaml中定義狀態(tài))使用apply操作資源:如果資源不存在,就創(chuàng)建,相當于 kubectl create如果資源已存在,就更新,相當于 kubectl patch

擴展:kubectl可以在node節(jié)點上運行嗎 ?

kubectl的運行是需要進行配置的,它的配置文件是在master節(jié)點下的$HOME/.kube,如果想要在node節(jié)點運行此命令,需要將master上的.kube文件復制到node節(jié)點上,即在master節(jié)點上執(zhí)行下面操作:

scp  -r  HOME/.kube   node1: HOME/

使用推薦: 三種方式應該怎么用 ?

創(chuàng)建/更新資源 使用聲明式對象配置 kubectl apply -f XXX.yaml

刪除資源 使用命令式對象配置 kubectl delete -f XXX.yaml

查詢資源 使用命令式對象管理 kubectl get(describe) 資源名稱

Kubernetes實戰(zhàn)

http://m.aloenet.com.cn/news/37769.html

相關文章:

  • 合肥知名網站制作新聞頭條最新消息今天
  • 桂林網站建設凡森網絡網絡推廣用什么軟件好
  • wordpress 主題 修改鄭州seo哪家好
  • 寧波網絡推廣制作seo是哪里
  • 沈陽網站seo排名優(yōu)化愛網站關鍵詞查詢工具
  • 網站模版建站免費引流人脈推廣軟件
  • 網站被降權的原因怎么知道網站有沒有被收錄
  • 做網站業(yè)務員怎么樣烘焙甜點培訓學校
  • 電商視覺設計網站批量優(yōu)化網站軟件
  • 外國做營銷方案的網站360建站和凡科哪個好
  • 建設銀行北京東四支行網站愛站網關鍵詞排名
  • 網站建設下什么科目武漢seo搜索引擎優(yōu)化
  • 慈溪做無痛同濟 網站北京最新疫情情況
  • 寧夏網站設計聯系電話推廣公司屬于什么公司
  • 合肥做網站多少錢資源網
  • wordpress sozo西安關鍵詞seo公司
  • 做網站銷售的技巧關鍵詞排名優(yōu)化教程
  • 電子商務網站開發(fā)模塊流程圖網站建設優(yōu)化哪家公司好
  • 做技術分享網站有哪些手機軟文廣告300字
  • 建甌做網站的公司實時軍事熱點
  • 網站內容設計要求網站seo的優(yōu)化怎么做
  • 如何創(chuàng)建自己的博客網站google store
  • 青島網站專業(yè)制作重慶關鍵詞排名首頁
  • 鄭州市人民政府網站網站seo方案案例
  • 怎么做58同城網站免費建站哪個最好
  • 網站策劃做營銷推廣廣告營銷
  • 沈陽網站制作找網勢科技國際軍事新聞
  • wordpress加個留言板谷歌seo排名技巧
  • 學校響應式網站模板網絡推廣有哪些途徑
  • 網站列表頁內容優(yōu)化關鍵詞哪家好