Kubernetes系列之Helm介紹篇

image

本次系列使用的所需部署包版本都使用的目前最新的或最新穩定版,安裝包地址請到公眾號內回復【K8s實戰】獲取

介紹


Helm 是?Deis?開發的一個用于 Kubernetes 應用的包管理工具,主要用來管理 Charts。有點類似于 Ubuntu 中的 APT 或 CentOS 中的 YUM。Helm Chart 是用來封裝 Kubernetes 原生應用程序的一系列 YAML 文件。可以在你部署應用的時候自定義應用程序的一些 Metadata,以便于應用程序的分發。對于應用發布者而言,可以通過 Helm 打包應用、管理應用依賴關系、管理應用版本并發布應用到軟件倉庫。對于使用者而言,使用 Helm 后不用需要編寫復雜的應用部署文件,可以以簡單的方式在 Kubernetes 上查找、安裝、升級、回滾、卸載應用程序。

Helm 工作原理


這張圖描述了 Helm 的幾個關鍵組件 Helm(客戶端)、Tiller(服務器)、Repository(Chart 軟件倉庫)、Chart(軟件包)之間的關系。

image

下載解壓


[root@master-01?~]# mkdir /opt/helm&&cd /opt/helm[root@master-01?helm]#wget https://storage.googleapis.com/kubernetes-helm/helm-v2.12.3-linux-amd64.tar.gz[root@master-01?helm]# wget https://storage.googleapis.com/kubernetes-helm/helm-v2.12.3-linux-amd64.tar.gz[root@master-01?helm]# tar xf helm-v2.12.3-linux-amd64.tar.gz?[root@master-01?helm]# cd linux-amd64/[root@master-01?linux-amd64]# mv helm /usr/bin/[root@master-01?linux-amd64]# helm versionClient: &version.Version{SemVer:"v2.12.3", GitCommit:"79d07943b03aea2b76c12644b4b54733bc5958d6", GitTreeState:"clean"}Error: could?not?find tiller

創建RBAC角色


創建 Kubernetes 的服務帳號和綁定角色

[root@master-01 helm]#kubectl create serviceaccount --namespace kube-system tiller[root@master-01 helm]#kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller

為 Tiller 設置帳號

使用 kubectl patch 更新 API 對象

[root@master-01?helm]# kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'deployment.extensions?"tiller-deploy"?patched

查看是否授權成功

[root@master-01?helm]# kubectl?get?deploy --namespace kube-system?tiller-deploy --output yaml|grep?serviceAccountserviceAccount:?tillerserviceAccountName: tiller

初始化Tiller


tiller是以Deployment部署在k8s集群中的,使用helm init就可以直接安裝

因為tiller默認是去storage.googleapis.com拉鏡像,所以我們要改成國內源?

[root@master-01?]# helm initCreating?/root/.helm?Creating?/root/.helm/repository?Creating?/root/.helm/repository/cache?Creating?/root/.helm/repository/local?Creating?/root/.helm/plugins?Creating?/root/.helm/starters?Creating?/root/.helm/cache/archive?Creating?/root/.helm/repository/repositories.yaml?Adding stable repo with URL: https://kubernetes-charts.storage.googleapis.com?Error: Looks like?"https://kubernetes-charts.storage.googleapis.com"?is?not?a valid chart repository?or?cannot be reached: Get https://kubernetes-charts.storage.googleapis.com/index.yaml: dial tcp?216.58.200.16:443: connect: connection refused

更換國內源

[root@master-01?~]# helm repo?add?stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts"stable"?has?been added?to?your repositories

再次初始化

[root@master-01?~]# helm init$HELM_HOME has been configured at?/root/.helm.Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.Please note:?by?default, Tiller?is?deployed with an insecure?'allow unauthenticated users'?policy.To prevent?this, run `helm init` with the --tiller-tls-verify flag.For more information?on?securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installationHappy Helming!

查看pod狀態

[root@master-02?~]# kubectl -nkube-system?get?po?-owideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATEScoredns-5d668bd598-dt4qm?1/1?Running?0?5h1m?172.17.79.3?192.168.209.132?<none>?<none>coredns-5d668bd598-f5g96?1/1?Running?1?18h?172.17.44.2?192.168.209.131?<none>?<none>kubernetes-dashboard-cb55bd5bd-gc84g?1/1?Running?0?3h25m?172.17.47.2?192.168.209.133?<none>?<none>tiller-deploy-58cf8bbc46-ss5nq?0/1?ImagePullBackOff?3?79s?172.17.44.4?192.168.209.131?<none>?<none>

解決無法 pull tiller

默認鏡像用的是gcr.io/kubernetes-helm/tiller:v2.12.3,國內無法下載,需要替換成國內地址

修改tiller pod 鏡像地址為registry.cn-beijing.aliyuncs.com/minminmsn/tiller:v2.12.3

[root@master-01?helm]# kubectl -nkube-system?edit?deploy tiller-deploydeployment.extensions/tiller-deploy edited[root@master-02?~]# kubectl -nkube-system?get?po?-owideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATEScoredns-5d668bd598-dt4qm?1/1?Running?0?5h3m?172.17.79.3?192.168.209.132?<none>?<none>coredns-5d668bd598-f5g96?1/1?Running?1?18h?172.17.44.2?192.168.209.131?<none>?<none>kubernetes-dashboard-cb55bd5bd-gc84g?1/1?Running?0?3h27m?172.17.47.2?192.168.209.133?<none>?<none>tiller-deploy-5bd5fcdbbd-zdrnj?1/1?Running?0?44s?172.17.58.2?192.168.209.130?<none>?<none>

結果

[root@master-01 ~]#?helm?versionClient: &version.Version{SemVer:"v2.12.3", GitCommit:"eecf22f77df5f65c823aacd2dbd30ae6c65f186e", GitTreeState:"clean"}Server: &version.Version{SemVer:"v2.12.3", GitCommit:"eecf22f77df5f65c823aacd2dbd30ae6c65f186e", GitTreeState:"clean"}

示例演示


新建一個helm chart

[root@master-01?helm]# helm create mychartCreating mychart

該命令創建了一個 mychart 目錄,該目錄結構如下所示。這里我們主要關注目錄中的 Chart.yaml、values.yaml、NOTES.txt 和 Templates 目錄。

[root@master-01?helm]# tree mychart/mychart/├── charts├── Chart.yaml├── templates│ ├── deployment.yaml│ ├── _helpers.tpl│ ├── ingress.yaml│ ├── NOTES.txt│ ├── service.yaml│ └── tests│ └── test-connection.yaml└──?values.yaml3?directories,?8?files

Chart.yaml 用于描述這個 Chart的相關信息,包括名字、描述信息以及版本等。

values.yaml 用于存儲 templates 目錄中模板文件中用到變量的值。

NOTES.txt 用于介紹 Chart 部署后的一些信息,例如:如何使用這個 Chart、列出缺省的設置等。

Templates 目錄下是 YAML 文件的模板,該模板文件遵循 Go template 語法。

Templates 目錄下 YAML 文件模板的值默認都是在 values.yaml 里定義的,比如在 deployment.yaml 中定義的容器鏡像。

image:?"{{ .Values.image.repository }}:{{ .Values.image.tag }}"

其中的 .Values.image.repository 的值就是在 values.yaml 里定義的 nginx,.Values.image.tag 的值就是 stable。

[root@master-01?helm]#cat mychart/values.yaml|grep?repositoryrepository: nginx[root@master-01?helm]#cat mychart/values.yaml|grep?tagtag:?stable

以上兩個變量值是在 create chart 的時候就自動生成的默認值,你可以根據實際情況進行修改。

修改應用介紹信息

[root@master-01?helm]#?cat?mychart/Chart.yamlapiVersion: v1appVersion:?"1.0"description: A Helm chart?for?Kubernetesname: mychartversion:?0.1.0

修改應用具體編排信息

[root@master-01?helm]#?cat?mychart/values.yaml?# Default?values?for?mychart.# This?is?a?YAML-formatted?file.# Declare variables?to?be?passed into your templates.replicaCount:?1image:repository: nginxtag:?stablepullPolicy: IfNotPresentnameOverride:?""fullnameOverride:?""service:type: ClusterIPport:?80ingress:enabled: falseannotations:?{}# kubernetes.io/ingress.class:?nginx# kubernetes.io/tls-acme:?"true"paths:?[]hosts:- chart-example.localtls:?[]# - secretName: chart-example-tls# hosts:# - chart-example.localresources:?{}# We usually recommend not?to?specify default resources?and?to?leave this?as?a?conscious# choice?for?the user. This also increases chances charts run?on?environments with little# resources, such?as?Minikube. If you?do?want?to?specify resources, uncomment the following# lines, adjust them?as?necessary,?and?remove?the curly braces after?'resources:'.# limits:# cpu:?100m# memory:?128Mi# requests:# cpu:?100m# memory:?128MinodeSelector: {}tolerations:?[]affinity: {}

檢查配置語法

[root@master-01?helm]# helm lint mychart==>?Linting mychart[INFO] Chart.yaml: icon?is?recommended1?chart(s) linted,?no?failures

如果文件格式錯誤,可以根據提示進行修改。

打包應用

[root@master-01?helm]# helm package mychartSuccessfully packaged chart?and?saved it?to: /opt/helm/mychart-0.1.0.tgz

mychart 目錄會被打包為一個 mychart-0.1.0.tgz 格式的壓縮包,該壓縮包會被放到當前目錄下,并同時被保存到了 Helm 的本地缺省倉庫目錄中。

查看本地倉庫

[root@master-01?helm]# helm repo?listNAME URL?stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/chartslocal http://127.0.0.1:8879/charts

啟動本地倉庫

[root@master-01 helm]#?helm?serve?&[1]?25758[root@master-01 helm]#?Regenerating?index.?This?may?take?a?moment.Now?serving?you?on?127.0.0.1:8879

默認情況只監聽127.0.0.1,如果你要綁定到其它網絡接口,可使用以下命令:

[root@master-01 helm]#helm?serve?--address?192.168.209.130:8879?&

部署應用

[root@master-01?helm]# helm install local/mychart --name test-01NAME: test-01LAST DEPLOYED: Tue Mar?12?16:38:04?2019NAMESPACE:?defaultSTATUS: DEPLOYEDRESOURCES:==>?v1/ServiceNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEtest-01-mychart ClusterIP?10.254.105.20?<none>?80/TCP?2s==>?v1/DeploymentNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGEtest-01-mychart?1?0?0?0?1s==>?v1/Pod(related)NAME READY STATUS RESTARTS AGEtest-01-mychart-7d84ff968f-76d2l?0/1?Pending?0?1sNOTES:1.?Get the application URL?by?running these commands:export?POD_NAME=$(kubectl get pods --namespace?default?-l?"app.kubernetes.io/name=mychart,app.kubernetes.io/instance=test-01"?-o jsonpath="{.items[0].metadata.name}")echo?"Visit http://127.0.0.1:8080 to use your application"kubectl port-forward $POD_NAME?8080:80

完成部署后,現在 Nginx 就已經部署到 Kubernetes 集群上。在本地主機上執行提示中的命令后,就可在本機訪問到該 Nginx 實例。

[root@master-01?helm]#?export?POD_NAME=$(kubectl?get?pods --namespace?default?-l?"app.kubernetes.io/name=mychart,app.kubernetes.io/instance=test-1"?-o jsonpath="{.items[0].metadata.name}")[root@master-01?helm]# echo?"Visit http://127.0.0.1:8080 to use your application"Visit http://127.0.0.1:8080 to use your application[root@master-01?helm]# kubectl port-forward $POD_NAME?8081:80Forwarding?from?127.0.0.1:8081?->?80Forwarding?from?[::1]:8081?->?80

在本機訪問

[root@master-01 ~]# curl 127.0.0.1:8081<!DOCTYPE html><html><head><title>Welcome to nginx!</title><style>body?{width:?35em;margin:?0?autofont-family: Tahoma, Verdana, Arial, sans-serif;}......

使用helm ls 可以看到已經部署的Release和對應的Chart

[root@master-01 ~]#?helm?lsNAME?REVISION?UPDATED?STATUS?CHART?APP?VERSION?NAMESPACEtest-1?1?Tue?Mar?12 18:19:41?2019?DEPLOYED?mychart-0.1.0?1.0?default

使用helm status可以看到Release狀態

[root@master-01?~]# helm status test-1LAST DEPLOYED: Tue Mar?12?18:19:41?2019NAMESPACE:?defaultSTATUS: DEPLOYEDRESOURCES:==>?v1/ServiceNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEtest-1-mychart ClusterIP?10.254.184.247?<none>?80/TCP?7m17s==>?v1/DeploymentNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGEtest-1-mychart?1?1?1?1?7m17s==>?v1/Pod(related)NAME READY STATUS RESTARTS AGEtest-1-mychart-85459fd5cd-z6twn?1/1?Running?0?7m16sNOTES:1.?Get the application URL?by?running these commands:export?POD_NAME=$(kubectl get pods --namespace?default?-l?"app.kubernetes.io/name=mychart,app.kubernetes.io/instance=test-1"?-o jsonpath="{.items[0].metadata.name}")echo?"Visit http://127.0.0.1:8080 to use your application"kubectl port-forward $POD_NAME?8080:80

升級和回退一個應用

從上面 helm ls 輸出的結果中我們可以看到有一個 Revision(更改歷史)字段,該字段用于表示某一個 Release 被更新的次數,我們可以用該特性對已部署的 Release 進行回退

修改 Chart.yaml 文件

將版本號從 0.1.0 修改為 0.2.0, 然后使用 helm package 命令打包并發布到本地倉庫。

[root@master-01?helm]#?cat?mychart/Chart.yaml?apiVersion: v1appVersion:?"1.0"description: A Helm chart?for?Kubernetesname: mychartversion:?0.2.0[root@master-01?helm]# helm package mychartSuccessfully packaged chart?and?saved it?to: /opt/helm/mychart-0.2.0.tgz

查看本地倉庫Chart信息

可以看到本地有兩個版本了

[root@master-01 ~]# helm search mychart -lNAME CHART VERSIONAPP VERSIONDESCRIPTION?local/mychart0.2.0 1.0 A Helm chart?for?Kuberneteslocal/mychart0.1.0 1.0 A Helm chart?for?Kubernetes

升級應用

現在用 helm upgrade 命令將已部署的 mike-test 升級到新版本。你可以通過 --version 參數指定需要升級的版本號,如果沒有指定版本號,則缺省使用最新版本。

[root@master-01?~]# helm upgrade test-1 local/mychartRelease?"test-1"?has been upgraded. Happy Helming!LAST DEPLOYED: Tue Mar?12?18:33:18?2019NAMESPACE:?defaultSTATUS: DEPLOYEDRESOURCES:==>?v1/Pod(related)NAME READY STATUS RESTARTS AGEtest-1-mychart-85459fd5cd-z6twn?1/1?Running?0?13m==>?v1/ServiceNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEtest-1-mychart ClusterIP?10.254.184.247?<none>?80/TCP?13m==>?v1/DeploymentNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGEtest-1-mychart?1?1?1?1?13mNOTES:1.?Get the application URL?by?running these commands:export?POD_NAME=$(kubectl get pods --namespace?default?-l?"app.kubernetes.io/name=mychart,app.kubernetes.io/instance=test-1"?-o jsonpath="{.items[0].metadata.name}")echo?"Visit http://127.0.0.1:8080 to use your application"kubectl port-forward $POD_NAME?8080:80

完成后,可以看到已部署的 mike-test 被升級到 0.2.0 版本。

[root@master-01 ~]#?helm?lsNAME?REVISIONUPDATED?STATUS?CHART?APP?VERSIONNAMESPACEtest-1?2?Tue?Mar?12 18:33:18?2019DEPLOYEDmychart-0.2.01.0?default

回退應用

如果更新后的程序由于某些原因運行有問題,需要回退到舊版本的應用。首先我們可以使用 helm history 命令查看一個 Release 的所有變更記錄。

[root@master-01 ~]#?helm?history?test-1REVISIONUPDATED?STATUS?CHART?DESCRIPTION?1?Tue?Mar?12 18:19:41?2019SUPERSEDEDmychart-0.1.0Install?complete2?Tue?Mar?12 18:33:18?2019DEPLOYED?mychart-0.2.0Upgrade?complete

我們可以使用下面的命令對指定的應用進行回退。

[root@master-01?~]# helm rollback test-1 1Rollback was a success! Happy Helming!

我們使用 helm ls 和 helm history 命令都可以看到 mychart 的版本已經回退到 0.1.0版本。

[root@master-01 ~]#?helm?lsNAME?REVISIONUPDATED?STATUS?CHART?APP?VERSIONNAMESPACEtest-1?3?Tue?Mar?12 18:35:52?2019DEPLOYEDmychart-0.1.01.0?default?[root@master-01 ~]#?helm?history?test-1REVISIONUPDATED?STATUS?CHART?DESCRIPTION?1?Tue?Mar?12 18:19:41?2019SUPERSEDEDmychart-0.1.0Install?complete2?Tue?Mar?12 18:33:18?2019SUPERSEDEDmychart-0.2.0Upgrade?complete3?Tue?Mar?12 18:35:52?2019DEPLOYED?mychart-0.1.0Rollback?to?1

刪除應用

如果需要刪除一個已部署的 Release,可以利用 helm delete 命令來完成刪除。

[root@master-01?~]# helm delete test-1release?"test-1"?deleted

確認應用是否刪除,該應用已被標記為 DELETED 狀態。

[root@master-01 ~]#?helm?ls?-a?test-1NAME?REVISIONUPDATED?STATUSCHART?APP?VERSIONNAMESPACEtest-1?3?Tue?Mar?12 18:35:52?2019DELETEDmychart-0.1.01.0?default

也可以使用 --deleted 參數來列出已經刪除的 Release

[root@master-01 ~]#?helm?ls?--deletedNAME?REVISIONUPDATED?STATUSCHART?APP?VERSIONNAMESPACEtest-1?3?Tue?Mar?12 18:35:52?2019DELETEDmychart-0.1.01.0?default

從上面的結果也可以看出,默認情況下已經刪除的 Release 只是將狀態標識為 DELETED 了 ,但該 Release 的歷史信息還是繼續被保存的。

[root@master-01 ~]#?helm?hist?test-1REVISIONUPDATED?STATUS?CHART?DESCRIPTION?1?Tue?Mar?12 18:19:41?2019SUPERSEDEDmychart-0.1.0Install?complete?2?Tue?Mar?12 18:33:18?2019SUPERSEDEDmychart-0.2.0Upgrade?complete?3?Tue?Mar?12 18:35:52?2019DELETED?mychart-0.1.0Deletion?complete

如果要移除指定 Release 所有相關的 Kubernetes 資源和 Release 的歷史記錄,可以用如下命令:

[root@master-01?~]# helm delete --purge test-1release?"test-1"?deleted

再次查看已刪除的 Release,已經無法找到相關信息

[root@master-01?~]# helm hist test-1Error: release:?"test-1"?not?found[root@master-01?~]# helm ls[root@master-01?~]# helm ls --deleted[root@master-01?~]# helm ls -a test-1

部署一個應用示例


部署 Wordpress

這里以一個典型的三層應用 Wordpress 為例,包括 MySQL、PHP 和 Apache。由于測試環境暫時沒有可用的 PersistentVolume(持久卷,簡稱 PV),這里暫時將其關閉。關于 Persistent Volumes 的相關信息我們會在后續的相關文章進行講解。

[root@master-01?helm]# helm install --name wordpress-test --set?"persistence.enabled=false,mariadb.persistence.enabled=false,serviceType=NodePort"?stable/wordpressNAME: wordpress-testLAST DEPLOYED: Tue Mar?12?19:13:45?2019NAMESPACE:?defaultSTATUS: DEPLOYEDRESOURCES:==> v1beta1/DeploymentNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGEwordpress-test-mariadb?1?1?1?0?3swordpress-test-wordpress?1?1?1?0?3s==> v1/Pod(related)NAME READY STATUS RESTARTS AGEwordpress-test-mariadb-59cfd7c475-27chl?0/1?Pending?0?3swordpress-test-wordpress-6fc9b7cc7f-dt7fq?0/1?ContainerCreating?0?3s==> v1/SecretNAME TYPE DATA AGEwordpress-test-mariadb Opaque?2?4swordpress-test-wordpress Opaque?2?4s==> v1/ConfigMapNAME DATA AGEwordpress-test-mariadb?1?4swordpress-test-mariadb-tests?1?4s==> v1/ServiceNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEwordpress-test-mariadb ClusterIP?10.254.153.229?<none>?3306/TCP?4swordpress-test-wordpress NodePort?10.254.154.132?<none>?80:43629/TCP,443:34204/TCP?3sNOTES:1.?Get the WordPress URL:Or running:export?NODE_PORT=$(kubectl?get?--namespace?default?-o jsonpath="{.spec.ports[0].nodePort}"?services wordpress-test-wordpress)export?NODE_IP=$(kubectl?get?nodes --namespace?default?-o jsonpath="{.items[0].status.addresses[0].address}")echo http://$NODE_IP:$NODE_PORT/admin2.?Login?with?the following credentials to see your blogecho Username: userecho Password: $(kubectl?get?secret --namespace?default?wordpress-test-wordpress -o jsonpath="{.data.wordpress-password}"?| base64 --decode)

部署完成后,用以上提示信息生成訪問地址和用戶名密碼

[root@master-01?helm]#?export?NODE_PORT=$(kubectl?get?--namespace?default?-o jsonpath="{.spec.ports[0].nodePort}"?services wordpress-test-wordpress)DE_IP:$NODE_PORT/admin[root@master-01?helm]#?export?NODE_IP=$(kubectl?get?nodes --namespace?default?-o jsonpath="{.items[0].status.addresses[0].address}")[root@master-01?helm]# echo http://$NODE_IP:$NODE_PORT/adminhttp://192.168.209.130:43629/admin[root@master-01?helm]# echo Username: userUsername: user[root@master-01?helm]# echo Password: $(kubectl?get?secret --namespace?default?wordpress-test-wordpress -o jsonpath="{.data.wordpress-password}"?| base64 --decode)Password: aOTe96YaSP

查看服務狀態

[root@master-01?helm]# kubectl get podNAME READY STATUS RESTARTS AGEdnstools-6b77cc4988-b5smz?1/1?Running?0?23hnginx-7899755b7-7s8fl?1/1?Running?0?24htests-1-mychart-7d84ff968f-76d2l?1/1?Running?0?170mwordpress-test-mariadb-59cfd7c475-27chl?1/1?Running?1?14mwordpress-test-wordpress-6fc9b7cc7f-dt7fq?1/1?Running?4?14m

訪問測試

image

image

好了,進行到這 hlem基本使用就結束了,敬請期待后續分享,謝謝!

往期文章一覽

1、Kubernetes集群搭建之系統初始化配置篇

2、Kubernetes集群搭建之企業級環境中基于Harbor搭建自己的私有倉庫

3、Kubernetes集群搭建之Etcd集群配置篇

4、Kubernetes集群搭建之CNI-Flanneld部署篇

5、Kubernetes集群搭建之Master配置篇

6、Kubernetes系列之Coredns and Dashboard介紹篇

7、Kubernetes系列之監控Metres-server實戰篇

END

如果您覺得不錯,請別忘了轉發、分享、點贊讓更多的人去學習, 您的舉手之勞,就是對小編最好的支持,非常感謝!

image

轉載于:https://www.cnblogs.com/guigujun/p/10550256.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248346.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248346.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248346.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HTNL筆記整合

簡述概括了HTML 的部分內容&#xff0c;不是很完善&#xff0c;希望能給予你們相對的幫助。 一下文件的整合百度云鏈接&#xff1a;HTML整合筆記 第一章 HTML入門 課時1&#xff1a;HTML初識 1、英文名&#xff08;Hyper Text Markup Language&#xff09;超文本標簽語言 對…

EXCEL 圖表 只在拐點的時候顯示數字

EXCEL圖表只在折線的拐點顯示數值&#xff0c;中間不需要顯示。同時往下拐的&#xff0c;顯示在上方&#xff0c;往上的顯示在下方&#xff0c;這樣數值不會擋住線。 首先&#xff0c;做一些模擬數據 因為起點和終點數值必須顯示&#xff0c;所以單元格&#xff0c;C2 D2 C19 D…

淺談Vue之雙向綁定

VUE實現雙向數據綁定的原理就是利用了 Object.defineProperty() 這個方法重新定義了對象獲取屬性值(get)和設置屬性值(set)的操作來實現的。那么Object.defineProperty究竟是該如何使用的呢&#xff1f;先看個例子 <!DOCTYPE html> <html lang"en"><h…

【AtCoder】AGC017

A - Biscuits dp[i][0/1]表示當前和是偶數還是奇數&#xff0c;直接轉移即可 #include <bits/stdc.h> #define fi first #define se second #define pii pair<int,int> #define mp make_pair #define pb push_back #define space putchar( ) #define enter putchar…

SQL語法(1、安裝操作)

1、數據庫的系統概述及安裝與基本使用 bilibili可查找安裝視頻百度了解一下 – 使用超級管理員登錄 CONN sys/change_on_install AS SYSDBA ; – 創建c##scott用戶 CREATE USER c##scott IDENTIFIED BY tiger ; – 為用戶授權 GRANT CONNECT,RESOURCE,UNLIMITED TABLESPACE…

java 中文字符和unicode編碼值相互轉化

java 中文字符和unicode編碼值相互轉化 https://blog.csdn.net/u011366045/article/details/79235217 版權聲明&#xff1a;本文為博主原創文章&#xff0c;未經博主允許不得轉載。 https://blog.csdn.net/u011366045/article/details/792352171、引用工具 import com.alibaba.…

Object 及toString() 方法的重寫

Object: 是所有的類的父類 &#xff0c;Object中所有的方法 &#xff0c; 子類都能使用 &#xff0c; 接口不是Object子類。 Person: /*將父類的equals方法 重寫* 不改變父類的源代碼 equals 比較內存地址* 比較兩個成員變量 變量值相等 返回true 不等 返回false* 重…

SQL語法練習

SQL語法練習https://blog.csdn.net/qq_30764991/article/details/81952197員工表建表語句: CREATE TABLE EMP ( ENAME VARCHAR2(30), EMPNO NUMBER(5), DEPTNO NUMBER(5), JOB VARCHAR2(20), HIREDATE DATE, COMM NUMBER(6,2), SAL NUMBER(6,2) ); 部門表建表語句: CREATE TA…

第22章:MongoDB-聚合操作--聚合管道--$out

①$out$out&#xff1a;利用此操作可以將查詢結果輸出到指定的集合里面。②范例&#xff1a;將投影的結果輸出到集合里③④⑤⑥⑦⑧⑨⑩??????????轉載于:https://www.cnblogs.com/Lucky-stars/p/10555296.html

SQL簡單查詢

1、簡單查詢 使用Oracle sql developer使用前&#xff0c;必須開啟的服務&#xff1a; 查詢emp表上的數據&#xff1a; select * from emp; Null為空&#xff0c;空不代表等于沒有&#xff0c;null&#xff01;0. 重新連接后&#xff0c;注意大小寫及空格位&#xff01; 簡…

實用小技巧(一):UIScrollView中上下左右滾動方向的判斷

https://www.jianshu.com/p/93e8459b6dae 2017.06.01 01:13* 字數 674 閱讀 1201評論 0喜歡 12017.06.01 01:13* 字數 674 閱讀 1201評論 0喜歡 1 版本記錄 版本號 時間 V1.0 2017.05.31 前言 ios中又很多實用的小技巧&#xff0c;實現不難很實用&#xff0c;以后我會慢慢的…

less.js

1.變量 2.混入 3.帶參的混入 4.選擇器的繼承&#xff0c;貌似還不支持 5.嵌套規則 6.運算 7.顏色函數 8.條件語句與控制&#xff0c;貌似不支持 9.命名空間 10.注釋 11.作用域 12.字符的插入 13.轉義 14.JavaScript 的賦值轉載于:https://www.cnblogs.com/I-am-fine/archive/20…

SQL限定查詢

1、限定查詢與排序顯示 1.1限定查詢的認識&#xff1a; 列&#xff1a;表中有大數據的信息&#xff0c;對數據進行篩選&#xff0c;查詢到自己想要的信息。 &#xff08;數據過多顯示過慢&#xff0c;或者死機&#xff0c;在已有的樣本數據庫容器CDB轉換為PDB之中&#xff09;…

Centos6.10源碼部署zabbix-3.2.6

環境&#xff1a;Centos6.10 已有lnmp環境 mysql5.7 php7.2 創建zabbix數據庫 mysql> create database zabbix character set utf8 collate utf8_bin; mysql> grant all privileges on zabbix.* to zabbixlocalhost identified by zabbix; 創建zabbix用戶 shell> …

淺談五大Python Web框架

http://www.csdn.net/article/2011-02-17/292058 導讀&#xff1a;作者飛龍寫了一篇《淺談Python Web框架》&#xff0c;文中他介紹了幾個Python Web框架和自己對選擇框架的分析。在他看來&#xff0c;用Django來快速開發一些Web運用是很不錯的選擇。以下是文章內容&#xff1a…

主流瀏覽器和內核及Web標準

目前網絡市場的瀏覽器主流&#xff1a; 課時3&#xff1a;web標準 WEB標準 w3c 萬維網聯盟組織&#xff0c;制定web標準的機構。 網頁主要由三部分組成&#xff1a; 結構&#xff08;Structure&#xff09;、 表現&#xff08;Presentation&#xff09; 行為&#xff08;Beh…

質量屬性六個常見屬性場景(《淘寶網》為例) 15

六個最常見的系統質量屬性分別是&#xff1a;可用性&#xff08;Availability&#xff09;、可修改性&#xff08;Modifiability&#xff09;、性能&#xff08;Performance&#xff09;、安全性&#xff08;Security&#xff09;、可測試性&#xff08;Testability&#xff09…

機器學習中的損失函數 (著重比較:hinge loss vs softmax loss)

https://blog.csdn.net/u010976453/article/details/78488279 1. 損失函數 損失函數&#xff08;Loss function&#xff09;是用來估量你模型的預測值 f(x)f(x) 與真實值 YY 的不一致程度&#xff0c;它是一個非負實值函數&#xff0c;通常用 L(Y,f(x))L(Y,f(x)) 來表示。損失函…

HTML入門第一和第二章

課時4&#xff1a;HTML初識 1、英文名&#xff08;Hyper Text Markup Language&#xff09;超文本標簽語言 對網頁上的內容進行描述 課時5&#xff1a;HTML骨架 課時6&#xff1a;我的第一個頁面及其標簽簡介 課時7&#xff1a;骨架記憶法 課時8&#xff1a;什么是標簽及其分…

mysql 指令

// 授予用戶某些權限GRANT ALL ON *.* TO USERHOST;// 進入mysql訪問特定數據庫mysql -u user -p database_name// 查看數據表結構DESCRIBE table_name;// 加載文本數據到tableLOAD DATA LOCAL INFILE file_path INTO TABLE table_name;// UPDATE語句UPDATE table_name SET col…