摘要:啟動并設(shè)置為開機(jī)自啟動安裝服務(wù)這部分配置與上一篇筆記完全相同。我們創(chuàng)建這個文件并填入如下內(nèi)容安裝完和之后將其啟動并設(shè)置為開機(jī)自啟動以上,角色的功能已經(jīng)安裝完成。
上一篇筆記中,我嘗試了使用 k8s 1.6 版本安裝一個最簡單的集群。這一次,我希望能夠增加 node 的數(shù)量并且安裝網(wǎng)絡(luò)插件,然后配置內(nèi)部的域名解析功能。
在起初的設(shè)想中,我仍然希望不配置各個組件間的認(rèn)證,只關(guān)心功能的正常運行。但在配置的過程中發(fā)現(xiàn) pod 中運行的組件如果要和 kube-apiserver 通信的話,必須要有相關(guān)的認(rèn)證信息,要么使用 ServiceAccount ,要么配置 kubeconfig 。那么在仍然希望安裝所進(jìn)行的配置最少的情況下,我選擇在 kube-apiserver 和 kube-controller-manager 之間配置 CA 和一組服務(wù)端證書,來支持 ServiceAccount 的正常使用。
參考資料:《Kubernetes權(quán)威指南》
Kubernetes Flannel網(wǎng)絡(luò)部署
為CentOS 7.2中的Kuberbetes集群搭建Dashboard
kubernetes:kubedns安裝
運行環(huán)境&軟件版本:Ubuntu 16.04.4 LTS
kubernetes v1.6.0
etcd v3.0.14
docker-ce 18.06.1-ce
flannel v0.10.0
k8s-dns 1.14.1
easyrsa3
角色規(guī)劃主機(jī)名 | IP地址 | 角色 | CPU/內(nèi)存 |
---|---|---|---|
u16-1 | 192.168.112.148 | master | 2核/2G |
u16-2 | 192.168.112.149 | node | 2核/2G |
u16-3 | 192.168.112.150 | node | 2核/2G |
另外預(yù)先規(guī)定 clusterIP 使用的網(wǎng)段 10.244.0.0/16,kube-dns 的 service 使用的 IP 為 10.244.0.10
環(huán)境準(zhǔn)備首先仍然是下載 kubernetes 1.6.0 和 對應(yīng)版本的 etcd,并上傳到服務(wù)器。
關(guān)閉 swap并在 /etc/fstab 文件中取消掉自動掛載
sudo swapoff -a # vim /etc/fstab 或者其他方式
如果系統(tǒng)上安裝了SELinux,需要將其關(guān)閉。另外還需要在防火墻上放開下面步驟中所有需要使用的端口,或者關(guān)閉防火墻管理軟件,我這里選擇將ubuntu16.04默認(rèn)的ufw關(guān)閉
sudo ufw disable
安裝 docker-ce ,這里我選擇添加阿里云的源并使用 apt-get 安裝:
# step 1: 安裝必要的一些系統(tǒng)工具 sudo apt-get update sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common # step 2: 安裝GPG證書 curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add - # Step 3: 寫入軟件源信息 sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" # Step 4: 更新并安裝 Docker-CE sudo apt-get -y update sudo apt-get -y install docker-ce
為了能夠使集群節(jié)點之間、集群內(nèi)外能夠通信,需要在 docker 的服務(wù)文件 /lib/systemd/system/docker.service 的 [Service] 段中添加下面內(nèi)容,含義為在啟動 docker 之后,修改 FORWARD 鏈的默認(rèn)規(guī)則為 ACCEPT。
ExecStartPost=/sbin/iptables -P FORWARD ACCEPT
在 /etc/hosts 中配置各個節(jié)點的解析,如果這里不配置節(jié)點之間可能無法通過 node 的 name 互相找到。
# 添加如下幾行 192.168.112.148 u16-1 192.168.112.149 u16-2 192.168.112.150 u16-3安裝 Master 功能 安裝 etcd 服務(wù)
tar xf etcd-v3.0.14-linux-amd64.tar.gz # 把解壓后的 etcd 和 etcdctl 復(fù)制到 /usr/bin 目錄下 sudo cp etcd-v3.0.14-linux-amd64/etcd{,ctl} /usr/bin/ # 創(chuàng)建 etcd 工作路徑和配置存放路徑 sudo mkdir /var/lib/etcd/ sudo mkdir /etc/etcd/ # 然后創(chuàng)建管理腳本 /lib/systemd/system/etcd.service 和配置文件 /etc/etcd/etcd.conf。內(nèi)容如下 cat /lib/systemd/system/etcd.service [Unit] Description=Etcd Server After=network.target [Service] Type=notify WorkingDirectory=/var/lib/etcd/ EnvironmentFile=-/etc/etcd/etcd.conf ExecStart=/usr/bin/etcd $ETCD_ARGS [Install] WantedBy=multi-user.target cat /etc/etcd/etcd.conf ETCD_ARGS="--listen-client-urls "http://192.168.112.148:2379" --advertise-client-urls "http://192.168.112.148:2379"" # 啟動并設(shè)置為開機(jī)自啟動 sudo systemctl daemon-reload sudo systemctl start etcd sudo systemctl enable etcd # 完成后可以檢查一下服務(wù)是否正常運行 systemctl status etcd # 也可以使用 etcdctl 來檢查 etcd 健康狀況 etcdctl --endpoints http://192.168.112.148:2379 cluster-health member 8e9e05c52164694d is healthy: got healthy result from http://192.168.112.148:2379 cluster is healthy
這里并沒有像上一篇筆記中那樣使用默認(rèn)配置讓 etcd 只監(jiān)聽本地回環(huán)的 2379 端口,因為現(xiàn)在除了 kube-apiserver 之外各個 node 上運行 flanneld 也需要使用 etcd ,所以選擇監(jiān)聽了本機(jī)IP的 2379 端口。
參數(shù)說明:安裝 kube-apiserver 服務(wù)
--listen-client-urls 指定要監(jiān)聽客戶端流量的URL列表,也就是對客戶端開放的地址和端口。
--advertise-client-urls 指定向客戶端告知的URL列表。
tar xf kubernetes-server-linux-amd64.tar.gz # 將 kube-apiserver、kube-controller-manager 和 kube-scheduler 的二進(jìn)制文件復(fù)制到 /usr/bin 目錄下 sudo cp kubernetes/server/bin/kube-{apiserver,controller-manager,scheduler} /usr/bin/ # 順帶把 kubectl 也放在系統(tǒng) PATH 中 sudo cp kubernetes/server/bin/kubectl /usr/bin # 創(chuàng)建日志存放目錄和配置存放目錄 sudo mkdir /var/log/kubernetes sudo mkdir /etc/kubernetes
下面需要創(chuàng)建 apiserver 與 controller-manager 之間認(rèn)證所需要的證書。
# 這里我準(zhǔn)備使用 easy-rsa 工具生成證書。先下載 easy-rsa curl -L -O https://storage.googleapis.com/kubernetes-release/easy-rsa/easy-rsa.tar.gz tar xf easy-rsa.tar.gz cd easy-rsa-master/easyrsa3/ # 初始化工具 ./easyrsa init-pki # 創(chuàng)建根證書(CA) ./easyrsa --batch "--req-cn=192.168.112.148@`date +%s`" build-ca nopass # 創(chuàng)建服務(wù)端證書和秘鑰,這里的 IP 一個是 master 所在 host 的 IP,另一個是 apiserver 的 clusterIP ./easyrsa --subject-alt-name="IP:192.168.112.148,IP:10.244.0.1" build-server-full server nopass # 創(chuàng)建證書存放目錄并把需要的證書及秘鑰復(fù)制 sudo mkdir /etc/kubernetes/pki sudo cp pki/ca.crt pki/issued/server.crt pki/private/server.key /etc/kubernetes/pki
然后創(chuàng)建管理腳本 /lib/systemd/system/kube-apiserver.service 和配置文件 /etc/kubernetes/apiserver
cat /lib/systemd/system/kube-apiserver.service [Unit] Description=Kubernetes API Server After=etcd.service Wants=etcd.service [Service] EnvironmentFile=/etc/kubernetes/apiserver ExecStart=/usr/bin/kube-apiserver $KUBE_API_ARGS Restart=on-failure Type=notify LimitNOFILE=65536 [Install] WantedBy=multi-user.target cat /etc/kubernetes/apiserver KUBE_API_ARGS="--storage-backend=etcd3 --etcd-servers=http://192.168.112.148:2379 --insecure-bind-address=0.0.0.0 --insecure-port=8080 --service-cluster-ip-range=10.244.0.0/16 --service-node-port-range=1-65535 --admission_control=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota --client-ca-file=/etc/kubernetes/pki/ca.crt --tls-cert-file=/etc/kubernetes/pki/server.crt --tls-private-key-file=/etc/kubernetes/pki/server.key --logtostderr=false --log-dir=/var/log/kubernetes --v=2" # 啟動并設(shè)置為開機(jī)自啟動 sudo systemctl daemon-reload sudo systemctl start kube-apiserver sudo systemctl enable kube-apiserver
kube-apiserver 的參數(shù)說明:安裝 kube-controller-manager 服務(wù)
--service-cluster-ip-range :指定集群 Cluster IP 網(wǎng)段。因為希望使用 10.244.0.0/16 作為使用的網(wǎng)段,所以在這里指定。
--admission_control :Kubernetes 集群的準(zhǔn)入控制設(shè)置,各控制模塊以插件形式依次生效。因為 pod 中運行的插件需要使用 serviceaccount ,所以這次不刪除 ServiceAccount 模塊。
--client-ca-file :指定CA根證書文件
--tls-cert-file :指定服務(wù)端證書文件
--tls-private-key-file :指定服務(wù)端私鑰文件
上一步已經(jīng)將需要的二進(jìn)制可執(zhí)行文件和證書秘鑰放在相應(yīng)的位置了,下面需要創(chuàng)建管理腳本 /lib/systemd/system/kube-controller-manager.service 和 配置文件 /etc/kubernetes/controller-manager
cat /lib/systemd/system/kube-controller-manager.service [Unit] Description=Kubernetes Controller Manager After=kube-apiserver.service Requires=kube-apiserver.service [Service] EnvironmentFile=/etc/kubernetes/controller-manager ExecStart=/usr/bin/kube-controller-manager $KUBE_CONTROLLER_MANAGER_ARGS Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target cat /etc/kubernetes/controller-manager KUBE_CONTROLLER_MANAGER_ARGS="--master=http://192.168.112.148:8080 --service-account-private-key-file=/etc/kubernetes/pki/server.key --root-ca-file=/etc/kubernetes/pki/ca.crt --logtostderr=false --log-dir=/var/log/kubernetes --v=2"
kube-controller-manager 參數(shù)說明:
--service-account-private-key-file :指定服務(wù)端私鑰。用于簽署 serviceaccount 的 token。
--root-ca-file :指定 ca 跟證書文件。配置了此項后,ca證書將被包含在 serviceaccount 中,然后就可以使用 serviceaccount 認(rèn)證 組件與apiserver 間的通訊。
啟動并設(shè)置為開機(jī)自啟動
sudo systemctl daemon-reload sudo systemctl start kube-controller-manager sudo systemctl enable kube-controller-manager安裝 kube-scheduler 服務(wù)
這部分配置與上一篇筆記完全相同。編輯 systemd 服務(wù)文件 /lib/systemd/system/kube-scheduler.service
[Unit] Description=Kubernetes Scheduler Server After=kube-apiserver.service Requires=kube-apiserver.service [Service] EnvironmentFile=/etc/kubernetes/scheduler ExecStart=/usr/bin/kube-scheduler $KUBE_SCHEDULER_ARGS Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target
環(huán)境變量文件 /etc/kubernetes/scheduler 中定義了 kube-scheduler 啟動參數(shù) KUBE_SCHEDULER_ARGS。我們創(chuàng)建這個文件并填入如下內(nèi)容
KUBE_SCHEDULER_ARGS="--master=http://192.168.112.148:8080 --logtostderr=false --log-dir=/var/log/kubernetes --v=2"
安裝完 kube-controller-manager 和 kube-scheduler 之后將其啟動并設(shè)置為開機(jī)自啟動
sudo systemctl daemon-reload sudo systemctl start kube-scheduler sudo systemctl enable kube-scheduler
以上,master 角色的功能已經(jīng)安裝完成。下面需要在所有的節(jié)點安裝 node 角色的功能。
安裝 node 功能安裝 kubelet 和 kube-proxy 的過程與上篇筆記基本相同。
安裝 kubelet 和 kube-proxytar xf kubernetes-server-linux-amd64.tar.gz # 將 kubelet 和 kube-proxy 的二進(jìn)制文件復(fù)制到 /usr/bin 目錄下 sudo cp kubernetes/server/bin/kube{let,-proxy} /usr/bin/ # 創(chuàng)建 kubelet 的工作路徑 /var/lib/kubelet 、配置文件的存放路徑 /etc/kubernetes 和 日志路徑 /var/log/kubernetes。master 節(jié)點上已經(jīng)創(chuàng)建過的文件夾則不需要再次創(chuàng)建 sudo mkdir /var/lib/kubelet sudo mkdir /var/log/kubernetes sudo mkdir /etc/kubernetes # 下一步分別創(chuàng)建 kubelet 和 kube-proxy 的管理腳本與配置文件,內(nèi)容如下 cat /lib/systemd/system/kubelet.service [Unit] Description=Kubernetes Kubelet Server After=docker.service Requires=docker.service [Service] WorkingDirectory=/var/lib/kubelet EnvironmentFile=/etc/kubernetes/kubelet ExecStart=/usr/bin/kubelet $KUBELET_ARGS Restart=on-failure [Install] WantedBy=mulit-user.targe cat /lib/systemd/system/kube-proxy.service [Unit] Description=Kubernetes Kube-Proxy Server After=networking.service Requires=networking.service [Service] EnvironmentFile=/etc/kubernetes/proxy ExecStart=/usr/bin/kube-proxy $KUBE_PROXY_ARGS Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target cat /etc/kubernetes/kubelet KUBELET_ARGS="--api-servers=http://192.168.112.148:8080 --hostname-override=u16-1 --cgroups-per-qos=false --enforce-node-allocatable="" --logtostderr=false --log-dir=/var/log/kubernetes --v=2" cat /etc/kubernetes/proxy KUBE_PROXY_ARGS="--master=http://192.168.112.148:8080 --logtostderr=false --log-dir=/var/log/kubernetes --v=2" # 將這兩個服務(wù)啟動并設(shè)置為開機(jī)自動啟動 sudo systemctl start kubelet kube-proxy && sudo systemctl enable kubelet kube-proxy
--hostname-override ,設(shè)置本節(jié)點顯示的名字,需要與/etc/hosts 中的解析對應(yīng)安裝 flanneld 網(wǎng)絡(luò)插件
wget 下載 flannel 對應(yīng)版本的二進(jìn)制程序包,也可以在 github 上下載。
wget https://github.com/coreos/flannel/releases/download/v0.10.0/flannel-v0.10.0-linux-amd64.tar.gz # 解壓出需要的程序放在 /usr/bin 下 tar xf flannel-v0.10.0-linux-amd64.tar.gz sudo cp flanneld /usr/bin/ sudo cp mk-docker-opts.sh /usr/bin/
創(chuàng)建 systemd 管理腳本 /lib/systemd/system/flanneld.service。內(nèi)容如下:
cat /lib/systemd/system/flanneld.service [Unit] Description=Flanneld overlay address etcd agent After=network.target Before=docker.service [Service] EnvironmentFile=-/etc/kubernetes/flanneld ExecStart=/usr/bin/flanneld ${FLANNEL_ETCD} ${FLANNEL_OPTIONS} ExecStartPost=/usr/bin/mk-docker-opts.sh -d /run/flannel/docker Type=notify [Install] WantedBy=multi-user.target RequiredBy=docker.service
創(chuàng)建 flanneld 的配置文件:
cat /etc/kubernetes/flanneld FLANNEL_ETCD="-etcd-endpoints=http://192.168.112.148:2379" FLANNEL_ETCD_KEY="/coreos.com/network"
同時還需要修改 /lib/systemd/system/docker.service 。在 After= 和 Requires= 后添加 flanneld.service 。添加環(huán)境變量文件 EnvironmentFile=-/run/flannel/docker ,同時在 ExecStart= 后面添加環(huán)境變量 DOCKER_OPTS , 比如:ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_OPTS
flannel 網(wǎng)絡(luò)插件使用 etcd 存儲和同步信息,在啟動 flanneld 之前首先在 etcd 中設(shè)置初始的配置:
etcdctl --endpoints http://192.168.112.148:2379 set /coreos.com/network/config "{ "Network": "10.244.0.0/16" }"
然后就可以啟動 flanneld 了
sudo systemclt daemon-reload sudo systemctl start flanneld && sudo systemctl enable flanneld # 啟動 flanneld 之后還需要重啟 docker 和 kubelet sudo systemctl restart docker kubelet # 之后查看本機(jī)網(wǎng)卡信息,docker0 的 ip 地址已經(jīng)變?yōu)橹付ǖ?ip 段。
下面我們可以創(chuàng)建幾個 在不用 node 上運行的 pod 來測試網(wǎng)絡(luò)是否已經(jīng)聯(lián)通。
# 還是先解決基礎(chǔ)鏡像的問題 sudo docker image pull mirrorgooglecontainers/pause-amd64:3.0 sudo docker tag mirrorgooglecontainers/pause-amd64:3.0 gcr.io/google_containers/pause-amd64:3.0 # 然后創(chuàng)建一個 yaml 文件用于配置測試用的資源 cat test.yml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: nginx spec: replicas: 1 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest --- apiVersion: v1 kind: Pod metadata: name: client spec: restartPolicy: OnFailure containers: - name: curl image: appropriate/curl args: - /bin/sh - -c - sleep 6000 # 創(chuàng)建資源 kubectl apply -f test.yml kubectl get pod -o wide # 檢查 NODE 列,因為要測試不同 node 上是否可以互相通信,所以希望這里2個 pod 不在一個 node 上。 NAME READY STATUS RESTARTS AGE IP NODE client 1/1 Running 0 2m 10.244.62.2 u16-1 nginx-3406752312-7z5fs 1/1 Running 0 2m 10.244.18.2 u16-2 # 之后進(jìn)入 client pod 的 容器內(nèi)測試連接 nginx POD 的服務(wù),看是否能夠正常訪問。 kubectl exec -it client /bin/sh # 下面為在容器內(nèi)操作 curl 10.244.18.2 # 顯示訪問正常安裝插件Welcome to nginx! …………
我在這里只嘗試安裝了 kube-dns 插件,希望達(dá)到的目標(biāo)是 k8s 內(nèi)的容器在創(chuàng)建時都會指定 kube-dns 插件的地址為 dns 服務(wù)器,并且這個 dns 可以解析集群創(chuàng)建的 service 的地址。
kube-dns 的安裝是將 kube-dns 作為一個 deployment 部署,它的 yaml 文件在 k8s 源碼包內(nèi)。
# 源碼包已經(jīng)包含在我們下載的二進(jìn)制安裝包內(nèi)了,先解壓 cd kubernetes/ tar xf kubernetes-src.tar.gz cd cluster/addons/dns # 將需要修改的文件復(fù)制一份并作出修改,將模板改中的變量改為實際的值 cp kubedns-svc.yaml.sed kubedns-svc.yaml cp kubedns-controller.yaml.sed kubedns-controller.yaml sed -i "s/$DNS_SERVER_IP/10.244.0.10/g" kubedns-svc.yaml sed -i "s/$DNS_DOMAIN/cluster.local/g" kubedns-controller.yaml # 創(chuàng)建 kube-dns 所需要的 configmap、serviceaccount、service和deployment kubectl apply -f kubedns-cm.yaml kubectl apply -f kubedns-sa.yaml --namespace=kube-system # sa 的模板中并沒有指定 namespace ,其他模板中指定了,不知道什么原因,但我在這里需要將 serviceaccount 創(chuàng)建在 kube-system 的 namespace 下。 kubectl apply -f kubedns-svc.yaml kubectl apply -f kubedns-controller.yaml # 查看 dns 是否正常運行,這里 READY 為 3/3,STATUS 為 Running 表示運行成功 kubectl get pod -n kube-system
安裝完成 kube-dns 后,還需要在所有 kubelet 的啟動參數(shù)中增加下面參數(shù),然后重啟 kubelet。
--cluster-dns=10.244.0.10 --cluster-domain=cluster.local
測試一下功能
# 回到剛才的 test.yml 所在的目錄,刪除掉剛才的資源并重新創(chuàng)建 kubectl delete -f test.yml kubectl apply -f test.yml # 再創(chuàng)建文件用于 nginx 的svc cat test-svc.yml apiVersion: v1 kind: Service metadata: name: nginx-svc spec: selector: app: nginx ports: - port: 80 targetPort: 80 protocol: TCP # 創(chuàng)建 svc kubectl apply -f test-svc.yml # 之后進(jìn)入 client pod 的容器內(nèi)測試通過 svc 的名字連接 nginx POD 的服務(wù),看是否能夠正常訪問。 kubectl exec -it client /bin/sh # 下面為在容器內(nèi)操作 curl http://nginx-svcWelcome to nginx! ………… # 因為此時新部署的pod都已經(jīng)自動配置了 kube-dns 作為 dns 服務(wù)器??梢圆榭?/etc/resolv.conf cat /etc/resolv.conf nameserver 10.244.0.10 search default.svc.cluster.local svc.cluster.local cluster.local localdomain options ndots:5
至此,一個多 node 間的 pod 可以互相通信,并且可以通過 dns 來訪問或者進(jìn)行服務(wù)發(fā)現(xiàn)的 k8s 集群已經(jīng)部署完成。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/32731.html
摘要:日志級別通過啟動并設(shè)置為開機(jī)自啟動之后可以通過來檢查服務(wù)器運行狀態(tài)安裝服務(wù)編輯服務(wù)文件環(huán)境變量文件中定義了啟動參數(shù)。 不知道有沒有人和我一樣,在手動安裝時因為很多原因沒有成功(主要還是知識儲備不夠),被各種高可用配置和各種證書權(quán)限弄得迷迷糊糊。這個筆記是我在嘗試了很多種手動安裝Kubernetes集群教程中的方法失敗后產(chǎn)生的想法,希望能夠?qū)?fù)雜的配置化繁為簡,呈現(xiàn)出一個基本功能的Kub...
摘要:正在走遠(yuǎn),新年之初,小數(shù)精選過去一年閱讀量居高的技術(shù)干貨,從容器到微服務(wù)云原生,匯集成篇精華集錦,充分反映了這一年的技術(shù)熱點走向。此文值得收藏,方便隨時搜索和查看。,小數(shù)將繼續(xù)陪伴大家,為朋友們奉獻(xiàn)更有逼格的技術(shù)內(nèi)容。 2017正在走遠(yuǎn),新年之初,小數(shù)精選過去一年閱讀量居高的技術(shù)干貨,從容器、K8S 到微服務(wù)、云原生、Service Mesh,匯集成52篇精華集錦,充分反映了這一年的技...
摘要:主要在文件附加下面的源我使用的是阿里的鏡像,如果你使用的其他國內(nèi)鏡像,請找對應(yīng)的鏡像源然后執(zhí)行下列命令,安裝軟件。參考資料只要用小朋友都能部署基本安裝基于阿里云鏡像站安裝用在上快速構(gòu)建測試集群 本次安裝環(huán)境是Ubuntu16.04,其他環(huán)境下,shell命令會有一些不同,但步驟應(yīng)該大致相同,默認(rèn)docker已經(jīng)安裝完成 下載 下載安裝下列軟件 kubelet Node上運行的節(jié)點代理...
摘要:具體來說,包管理器就是可以通過命令行,幫助你把外部庫和插件放到你的項目里面并在之后進(jìn)行版本升級,這樣就不用手工復(fù)制和更新庫。現(xiàn)在有的包管理器主要是和。 一、基礎(chǔ) 1、學(xué)習(xí)HTML基礎(chǔ) HTML給你的網(wǎng)頁賦予了結(jié)構(gòu)。它就像是人的骨架那樣讓你保持站立。首先你需要去學(xué)習(xí)語法以及它必須提供的一切。你的學(xué)習(xí)應(yīng)該聚焦在下面這些東西上: 學(xué)習(xí)HTML基礎(chǔ),了解如何編寫語義HTML 理解如何把網(wǎng)頁分...
閱讀 2286·2021-09-26 09:55
閱讀 3620·2021-09-23 11:22
閱讀 2180·2019-08-30 15:54
閱讀 1920·2019-08-28 18:03
閱讀 2622·2019-08-26 12:22
閱讀 3455·2019-08-26 12:20
閱讀 1750·2019-08-26 11:56
閱讀 2270·2019-08-23 15:30