Kubernetes(K8s) 安裝(使用kubeadm安裝Kubernetes集羣)

概述:html

        這篇文章是爲了介紹使用kubeadm安裝Kubernetes集羣(能夠用於生產級別)。使用了Centos 7系統。node

PS:linux

     篇幅有點長,可是比較詳細、比較全面git

1、Centos7 配置說明

1.1   Firewalld(防火牆)

CentOS Linux 7 默認開起來防火牆服務(firewalld),而Kubernetes的Master與工做Node之間會有大量的網絡通訊,安全的作法是在防火牆上配置Kbernetes各組件(api-server、kubelet等等)須要相互通訊的端口號。在安全的內部網絡環境中能夠關閉防火牆服務。github

關閉防火牆的命令:docker

1 # firewall-cmd --state           #查看防火牆狀態
2 # systemctl stop firewalld.service        #中止firewall
3 # systemctl disable firewalld.service     #禁止firewall開機啓動

1.2   SELinux

建議禁用SELinux,讓容器能夠讀取主機文件系統json

執行命令:centos

1 # getenforce        #查看selinux狀態
2 # setenforce 0       #臨時關閉selinux
3 # sed -i 's/^ *SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config  #永久關閉(需重啓系統)
4 # shutdown -r now   #重啓系統

2、安裝準備工做

2.1   安裝環境

軟硬件api

最低配置瀏覽器

推薦配置

CPU和內存

Master: 至少2 Core和4G內存

Node:至少4 Core和16G內存

Master:4 core和16G內存

Node:應根據須要運行的容器數量進行配置

Linux操做系統

基於x86_64架構的各類Linux發行版本,Kernel版本要求在3.10及以上

Red Hat Linux 7

CentOS 7

 

 

 

 

 

 

 

 

 

 

說明:

       以上爲建議配置,實際安裝過程當中,Master必須2 core 及以上(不然安裝失敗,切記),Node能夠採用1 core。

2.2   部署環境說明

主機列表:

主機名

Centos版本

ip

docker version

flannel version

Keepalived version

主機配置

備註

master01

7.6.1810

192.168.0.6

18.09.9

v0.11.0

v1.3.5

2C1G

control plane

work01

7.6.1810

192.168.0.10

18.09.9

/

/

1C1G

worker nodes

work02

7.6.1810

192.168.0.12

18.09.9

/

/

1C1G

worker nodes

VIP

7.6.1810

192.168.0.130

18.09.9

v0.11.0

v1.3.5

4C4G

在control plane上浮動

client

7.6.1810

192.168.0.234

/

/

/

4C4G

client(可不須要)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

共有7臺服務器,3臺control plane,3臺work,1臺client。

k8s 版本(可根據須要進行更改):

主機名

kubelet version

kubeadm version

kubectl version

備註

master01

v1.16.4

v1.16.4

v1.16.4

kubectl選裝

work01

v1.16.4

v1.16.4

v1.16.4

kubectl選裝

work02

v1.16.4

v1.16.4

v1.16.4

kubectl選裝

client

/

/

v1.16.4

client

 

 

 

 

 

 

 

 

 

 

 

 

2.3. 配置主機名(master和node節點都執行)

2.3.1 修改主機名

Master主機改成master01,執行如下命令:

1 # hostnamectl set-hostname master01 #修改主機名稱爲master01
2 # more /etc/hostname  #查看修改結果

一樣的修改node01和node02(注意主機名爲node01和node02)

說明:

       退出從新登錄便可顯示新設置的主機名master01,從新登陸以後

 

2.3.2 修改hosts文件

執行如下命令:

cat >> /etc/hosts << EOF
192.168.0.6 master01 192.168.0.10 node01 192.168.0.12 node02 EOF

2.3.3 禁用swap

Kubeadm建議關閉交換空間的使用,簡單來講,執行swapoff -a命令,而後在/etc/fstab中刪除對swap的加載,並從新啓動服務器便可。

臨時禁用,執行如下命令:

# swapoff -a

永久禁用,須要在swapoff -a以後,執行如下命令:

# sed -i.bak '/swap/s/^/#/' /etc/fstab

2.3.4 設置kubernetes源

2.3.4.1 新增kubernetes源

執行如下命令:

# 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

2.3.4.2 更新緩存

# yum clean all
# yum -y makecache

3、Docker安裝(master和node節點都執行)

注意:

       安裝docker以前,最好確認一下,kubernetes支持哪些版本的docker(kubernetes和docker的版本要對應,不然可能會形成從新安裝)。

3.1 卸載/更新已經安裝的Docker

# 卸載docker

#1. 列出安裝過的包

# yum list installed | grep docker

#2. 根據安裝過的包進行卸載

# yum -y remove docker-ce-cli.x86_64
# yum -y remove docker-ce.x86_64
# yum -y remove containerd.io

# 更新docker

# yum -y update docker

3.2 安裝Docker環境

3.2.1 配置docker源

如已安裝過docker,則不須要進行此步驟

# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

3.2.2 安裝依賴包

# yum install -y yum-utils device-mapper-persistent-data lvm2

3.2.3 設置從stable倉庫獲取docker

# yum-config-manager --add-repo  https://download.docker.com/linux/centos/docker-ce.repo

3.2.4 安裝Docker

# yum install docker-ce-18.09.9 docker-ce-cli-18.09.9 containerd.io -y

說明:

       執行以上命令以前,能夠看看docker版本,執行如下命令查看

# yum list docker-ce --showduplicates | sort -r

3.2.5 啓動Docker(並設置爲開機啓動)

# systemctl start docker && systemctl enable docker

3.2.6 命令補全

安裝bash-completion

# yum -y install bash-completion

加載bash-completion

# source /etc/profile.d/bash_completion.sh

3.2.7 鏡像加速(並修改Cgoup Driver)

# mkdir -p /etc/docker
# tee /etc/docker/daemon.json <<-'EOF'
{
    "registry-mirrors": ["https://usydjf4t.mirror.aliyuncs.com", 
    "https://registry.docker-cn.com"]
    , "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

# systemctl daemon-reload
# systemctl restart docker

說明:

       修改cgroupdriver是爲了消除告警:

[WARNING IsDockerSystemdCheck]: detected 「cgroupfs」 as the Docker cgroup driver. The recommended driver is 「systemd」. Please follow the guide at https://kubernetes.io/docs/setup/cri/

4、Keepalived安裝(master節點安裝)

4.1 安裝keepalived

# yum -y install keepalived

4.2 keepalived配置

保留默認配置

# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived_default.conf

寫入新的配置

# cat <<EOF > /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
   router_id master01
}

vrrp_instance VI_1 {
    state MASTER
    interface enp0s3
    virtual_router_id 50
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.0.130
    }
}

EOF

說明:

       特別注意紅色字體文本,master01是主機名稱(若是有其餘主機則使用對應的主機名稱進行替換),enp0s3是網卡名稱(每一個linux系統可能不一致),192.168.0.130是虛擬IP

 

4.3 啓動keepalived

# service keepalived start && systemctl enable keepalived

4.4 VIP查看

在master機器上執行

# ip a

能夠看到VIP在master01(目前只有一臺master,之後可能會有多個master)上

5、安裝k8s(master和node節點都執行)

5.1 查看kubernetes版本

# yum list kubelet --showduplicates | sort -r

說明:

       本文安裝的kubelet版本是1.16.4,該版本支持的docker版本爲1.13.1, 17.03, 17.06, 17.09, 18.06, 18.09。

5.2 安裝kubelet、kubeadm和kubectl(注意版本號,根據須要進行改變)

# yum install -y kubelet-1.16.4 kubeadm-1.16.4 kubectl-1.16.4

說明:

  • kubelet 運行在集羣全部節點上,用於啓動Pod和容器等對象的工具
  • kubeadm 用於初始化集羣,啓動集羣的命令工具
  • kubectl 用於和集羣通訊的命令行,經過kubectl能夠部署和管理應用,查看各類資源,建立、刪除和更新各類組件

5.3 啓動kubelet(並設置爲開機啓動)

# systemctl enable kubelet && systemctl start kubelet

5.4 命令補全

# echo "source <(kubectl completion bash)" >> ~/.bash_profile
# source .bash_profile

5.5 下載鏡像

Kubernetes幾乎全部的安裝組件和Docker鏡像都放在goolge本身的網站上,直接訪問可能會有網絡問題,這裏的解決辦法是從阿里雲鏡像倉庫下載鏡像,拉取到本地之後改回默認的鏡像tag。本文經過運行image.sh腳本方式拉取鏡像。

直接執行如下命令(灰色背景部分):

# more image.sh #如下爲image.sh文件的內容
#!/bin/bash
url=registry.cn-hangzhou.aliyuncs.com/loong576 #阿里雲鏡像倉庫地址,能夠按需修改
version=v1.16.4 #安裝的kubernetes的版本(能夠按需修改)
images=(`kubeadm config images list --kubernetes-version=$version|awk -F '/' '{print $2}'`)
for imagename in ${images[@]} ; do
  docker pull $url/$imagename
  docker tag $url/$imagename k8s.gcr.io/$imagename
  docker rmi -f $url/$imagename
done

注意:

       若是須要下載其餘的kubernetes版本,須要修改對應的版本號(紅色字體部分)

 

5.6 查看已經下載的鏡像

# docker images

6、網絡插件(flannel)配置(Master執行)

本文的k8s網絡使用flannel,該網絡須要設置內核參數bridge-nf-call-iptables=1,修改這個參數須要系統有br_netfilter模塊。

 

說明:

       K8s網絡插件有不少,使用網絡插件以前,要進行判斷是否和系統適配。

 

6.1 br_netfilter模塊加載

查看br_netfilter模塊:

# lsmod |grep br_netfilter

若是系統沒有br_netfilter模塊則執行下面的新增命令,若有則忽略。

永久新增br_netfilter模塊:

# cat > /etc/rc.sysinit << EOF
#!/bin/bash
for file in /etc/sysconfig/modules/*.modules ; do
[ -x $file ] && $file
done
EOF

# cat > /etc/sysconfig/modules/br_netfilter.modules << EOF
modprobe br_netfilter
EOF

# chmod 755 /etc/sysconfig/modules/br_netfilter.modules

 

 

6.2 內核參數永久修改

# cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

# sysctl -p /etc/sysctl.d/k8s.conf

說明:

       如安裝網絡插件以後,長時間狀態沒有變動,則能夠試試重啓機器(或者是虛擬機,這裏是指Centos 7系統)。

 

7、初始化Master(Master節點執行)

說明:

       Master的kubernetes以前,須先肯定要肯定的網絡插件(由於可能會影響到初始化的參數),不一樣的系統可能須要使用不一樣的網絡插件(Centos 不支持 Calico)。

       建議先閱讀網絡插件資料。(Kubernetes全部網絡插件說明:這裏

7.1 建立初始化文件

7.1.1 獲取默認的初始化參數文件

# kubeadm config print init-defaults > init.default.yaml

7.1.2 查看init.default.yaml文件

# cat init.default.yaml

7.1.3 配置初始化文件

建立kubeadm.conf.yaml文件,輸入如下內容(灰色背景部分):

apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.16.4
apiServer:
  certSANs:    #填寫全部kube-apiserver節點的hostname、IP、VIP
  - master01
  - node01
  - node02
  - 192.168.0.6
  - 192.168.0.10
  - 192.168.0.12
  - 192.168.0.130
controlPlaneEndpoint: "192.168.0.130:6443"
networking:
  podSubnet: "10.244.0.0/16"  #這裏須要根據具體的網絡插件來配置(這裏使用的flannel網絡插件配置)

說明:

       注意紅色字體部份內容,須要根據init.default.yaml文件和本身的須要進行更改

 

7.2 初始化kubernetes

# kubeadm init --config=kubeadm.conf.yaml

說明:

       若是初始化失敗,可執行kubeadm reset後從新初始化(執行如下兩條命令)

# kubeadm reset
# rm -rf $HOME/.kube/config

初始化成功,以下圖:

 

按照提示執行下面的命令,複製配置文件到普通用戶的home目錄下:

# mkdir -p $HOME/.kube

# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

# chown $(id -u):$(id -g) $HOME/.kube/config

在其餘位置(或者主機),保存以下信息(其餘node節點加入集羣時使用):

You should now deploy a pod network to the cluster.

Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:

  https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:
kubeadm join
192.168.0.130:6443 --token afeqnz.vhp0e8rtrw6jz6v2 \ --discovery-token-ca-cert-hash sha256:d6a450aafb14e82efb69fbcb71e426bfed8e423d64b37bac85b3ff8ce7dc6562 \ --control-plane Then you can join any number of worker nodes by running the following on each as root: ## node加入集羣時使用 kubeadm join 192.168.0.130:6443 --token afeqnz.vhp0e8rtrw6jz6v2 \ --discovery-token-ca-cert-hash sha256:d6a450aafb14e82efb69fbcb71e426bfed8e423d64b37bac85b3ff8ce7dc6562

7.3 加載環境變量

# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile

# source .bash_profile

8、node節點加入集羣

8.1 開啓Master節點防火牆端口

說明:

       若是master節點的防火牆已經關閉,能夠直接跳過此小節

       若是node已經加入其它集羣,須要退出集羣,請執行在node上執行:

# kubeadm reset

查看防火牆狀態:

# systemctl status firewalld 或者 firewall-cmd --state

開啓6443端口

# firewall-cmd --zone=public --add-port=6443/tcp --permanent

## 出現success代表添加成功

命令含義:

--zone #做用域

--add-port=80/tcp  #添加端口,格式爲:端口/通信協議

--permanent   #永久生效,沒有此參數重啓後失效

重啓防火牆

# systemctl restart firewalld.service

說明:

       Kubernetes集羣中的Service可以使用的物理機端口號範圍爲30000~32767

一次所有公開全部可能使用的端口:

# firewall-cmd --zone=public --add-port=30000-32767/tcp --permanent

# systemctl restart firewalld.service

8.2 加入集羣

Master節點在初始化完成以後,最後一行代碼,以下:

# kubeadm join 192.168.0.130:6443 --token afeqnz.vhp0e8rtrw6jz6v2 \

    --discovery-token-ca-cert-hash sha256:d6a450aafb14e82efb69fbcb71e426bfed8e423d64b37bac85b3ff8ce7dc6562

把兩行信息複製出來,在node節點執行,以下圖:(join成功)

 

在master節點,執行如下命令查看已經加入的節點

# kubectl get nodes

 

說明:

       因爲沒有安裝網絡插件,這裏STATUS爲NotReady

9、安裝網絡插件(Master)

 在master主機上執行如下命令:

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

說明:

       因爲網絡緣由,可能會安裝失敗,能夠在瀏覽器直接下載kube-flannel.yml文件(也能夠在瀏覽器打開url地址,而後複製文件內容到文件),而後再執行apply

查看節點狀態,執行如下命令:

# kubectl get nodes

說明:

       STATUS從NotReady變爲Ready

10、Client配置(client端執行)

10.1 新增kubernetes源

# 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

10.2 更新緩存

# yum clean all && yum -y makecache

10.3 安裝kubectl

# yum install -y kubectl-1.16.4

10.4 命令補全

安裝bash- completion

# yum -y install bash-completion

加載bash-completion

# source /etc/profile.d/bash_completion.sh

10.5 從Master節點拷貝admin.conf

# mkdir -p /etc/kubernetes
# scp 192.168.0.6:/etc/kubernetes/admin.conf /etc/kubernetes/

說明:

       192.168.0.6 是master主機

# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile

# source .bash_profile

10.6 加載環境變量

# echo "source <(kubectl completion bash)" >> ~/.bash_profile
# source .bash_profile

10.7 Kubectl 測試

# kubectl get nodes

 

 

 

# kubectl get cs

 

# kubectl get po -o wide -n kube-system

 

11、Dashboard搭建(client端執行)

11.1 下載yaml

# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml

說明:

       若是鏈接超時,能夠多試幾回。也能夠在這裏下載

11.2 修改鏡像地址

# sed -i 's/kubernetesui/registry.cn-hangzhou.aliyuncs.com\/loong576/g' recommended.yaml

說明:

       也能夠採用其餘的一些鏡像(切換鏡像,須要更改recommended.yaml文件)

更改鏡像操做:

       若是須要更改鏡像的版本號,須要在阿里雲查詢一下是否有鏡像

 

 

 

 

       下載鏡像命令:(注意阿里雲是沒有帶版本號的,須要本身錄入版本號)

# docker pull registry.cn-hangzhou.aliyuncs.com/kubernetesui/dashboard:v2.0.0-rc5

 

 

 

11.3 配置yaml

外網訪問

# sed -i '/targetPort: 8443/a\ \ \ \ \ \ nodePort: 30001\n\ \ type: NodePort' recommended.yaml

說明:

       配置NodePort,外部經過https://NodeIp:NodePort 訪問Dashboard,此時端口爲30001

 

11.4 新增管理員帳號

建立超級管理員的帳號用於登陸Dashboard

# cat >> recommended.yaml << EOF
---
# ------------------- dashboard-admin ------------------- #
apiVersion: v1
kind: ServiceAccount
metadata:
  name: dashboard-admin
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: dashboard-admin
subjects:
- kind: ServiceAccount
  name: dashboard-admin
  namespace: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
EOF
 

 

11.5 部署Dashboard

# kubectl apply -f recommended.yaml

狀態查看:

# kubectl get all -n kubernetes-dashboard

令牌查看:

# kubectl describe secrets -n kubernetes-dashboard dashboard-admin

令牌爲(必定要注意可能存在換行的狀況):

eyJhbGciOiJSUzI1NiIsImtpZCI6IllkWjQxWENEYnBXYV9rUlNqWTRldjVOYXV3M0tPTklYTVZTWUZWOXp0SHMifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tZzRwdzUiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiNjNmNzllODUtNzMzMy00MDY1LTg1YTEtYzkxZTkzNjk3ZjA0Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXMtZGFzaGJvYXJkOmRhc2hib2FyZC1hZG1pbiJ9.vsizK9ZP53to5aL5d1oyFYAiR8Kt1LaQ_Lkt86yPgHp6QloMS_pLCdD7KZi76deQ4ISTFC9Ldc62zslLtY4qgxNvSUiVWj1bWUn2BfCJ-3jPxpd7ZOgr3Gbp2xAFc3xjgm-qZaOydec9i44CbkdiVDoAjL0Au78yt7aHSW8B6plc2fAYNdywtyIOAMhe7f0gjyRaWrGQje2CVduITxZ-2NCwd3EYQNs31OA-zUPFvel_xi_KzdMBuj4z7DdvIK9wPQHyuke0TIs5dHSUEtiY84erLMg5i0ZGXCd019D5Nrsd78fVe_NbO-NThVReskA-jt1FyhAUesZie4GX-2eL3Q

說明:

       若是安裝Dashboard過程當中出現問題,要仔細進行排查,可能pod尚未安裝完成,等待一段時間以後,再看看,若是仍是不行,則須要考慮一下中途是否有問題,是否須要從新安裝。

       若是忘記Token,能夠經過如下命令獲取:

# kubectl describe secret -n kubernetes-dashboard $(kubectl get secret -n kubernetes-dashboard |grep  kubernetes-dashboard-token | awk '{print $1}') |grep token | awk '{print $2}'

11.6 使用火狐瀏覽器瀏覽

https://192.168.0.6:30001

 

部署Dashboard以後,因爲證書問題致使沒法在瀏覽器瀏覽(暫時沒有找到解決方案,嘗試了網上的方式,不行,如下是嘗試的過程(能夠跳過))

 刪除已經部署的Dashboard

1. kubectl delete ns kubernetes-dashboard

https://github.com/kubernetes/dashboard/releases

2. 閱讀參考資料(並執行命令,除了刪除命令)

http://www.javashuo.com/article/p-uwvomipq-dx.html

 

12、查找問題方式

12.1 查看Pod詳細信息

查看全部Pod

# kubectl get pods --all-namespaces

查看狀態異常的Pod的詳細信息

# kubectl describe pod kubernetes-dashboard-8478d57dc6-p7jt7 --namespace=kubernetes-dashboard

說明:

       能夠看到在哪臺Node上建立了容器

 

 

12.2 防火牆的問題

建議關閉防火牆

# systemctl stop firewalld.service

# systemctl disable firewalld.service

說明:

       若是不關閉防火牆,可能會形成容器產生錯誤,如no host to route,是由於防火牆攔截了端口。

12.3 Dashboard 證書過時問題

  

12.4 Node節點執行kubectl命令出錯問題

錯誤描述信息:

The connection to the server raw.githubusercontent.com was refused - did you specify the right host or port?

須要將master節點的 /etc/kubernetes/admin.conf 文件複製到node節點下。

 

參考資料

Kubernetes的安裝:

https://www.kubernetes.org.cn/6632.html

CentOS Linux 開放端口:

http://www.javashuo.com/article/p-pnauwzxw-mb.html

Kubernetes全部網絡插件說明:

https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/#pod-network

相關文章
相關標籤/搜索